Disclaimer: The purpose of the Open Case Studies project is to demonstrate the use of various data science methods, tools, and software in the context of messy, real-world data. A given case study does not cover all aspects of the research process, is not claiming to be the most appropriate way to analyze a given data set, and should not be used in the context of making policy decisions without external consultation from scientific experts.

Motivation


This analysis explores how different countries have contributed to Carbon Dioxide (CO2) emissions over time and how CO2 emission rates may relate to increasing global temperatures and increased rates of natural disaster and storms. This report provides a basis for the motivation: https://www.epa.gov/report-environment/greenhouse-gases.

CO2 makes up the largest proportion of greenhouse gas emissions in the United States:

A variety of sources and sectors contribute to greenhouse gas emissions:

So why should we pay attention to greenhouse gases?

According to the US Environmental Protection Agency (EPA) Inventory of U.S. Greenhouse Gas Emissions and Sinks 2020 Report:

Greenhouse gases absorb infrared radiation, thereby trapping heat in the atmosphere and making the planet warmer. The most important greenhouse gases directly emitted by humans include carbon dioxide (CO2), methane (CH4), nitrous oxide (N2O), and several fluorine-containing halogenated substances. Although CO2, CH4, and N2O occur naturally in the atmosphere, human activities have changed their atmospheric concentrations. From the pre- industrial era (i.e., ending about 1750) to 2018, concentrations of these greenhouse gases have increased globally by 46, 165, and 23 percent, respectively (IPCC 2013; NOAA/ESRL 2019a, 2019b, 2019c).

There are many signs that our planet is experiencing warmer temperatures:

The connection between greenhouse gas levels and global temperatures and the influence of increased global temperatures on human health are motivated by these reports:

Melillo, J.M., T.C. Richmond, and G.W. Yohe (eds.). 2014. Climate change impacts in the United States: The third National Climate Assessment. U.S. Global Change Research Program.

  1. “Inventory of US Greenhouse Gas Emissions and Sinks: 1990–2018.” EPA 430-R-20-002, Tech. Rep. https://www.epa.gov/ghgemissions/inventory-us-greenhouse-gas-emissions-and-sinks.

The National Climate Assessment Report states that:

Heat-trapping gases already in the atmosphere have committed us to a hotter future with more climate-related impacts over the next few decades. The magnitude of climate change beyond the next few decades depends primarily on the amount of heat-trapping gases that human activities emit globally, now and in the future

See here and here for more information.

Main Questions


Our main question:

  1. How have global CO2 emission rates changed over time? In particular for the US, and how does the US compare to other countries?
  2. Are US CO2 emissions, global temperatures, and US storm rates associated?

Learning Objectives


In this case study, we will explore CO2 emission data from around the world. We will also focus on the US specifically to evaluate patterns of temperatures and storm activity. This case study will particuarly focus on visualizations of patterns over time. We will especially focus on using packages and functions from the Tidyverse, such as plotlyand gganimate. The tidyverse is a library of packages created by RStudio. While some students may be familiar with previous R programming packages, these packages make data science in R especially efficient.


We will begin by loading the packages that we will need:

Package Use
here to easily load and save data
tidyverse to wrangle the data and create ggplot2 plots
readxl to import the Excel file data
plotyly to make the visualizations
gganimate to make the plots interactive
RColorBrewer to have greater control over the color in our plots

The first time we use a function, we will use the :: to indicate which package we are using. Unless we have overlapping function names, this is not necessary, but we will include it here to be informative about where the functions we will use come from.

Context


Greenhouse gas emissions are due to both natural processes and antropogenic (human-derived) activities.

These emissions are one of the contributing factors to rising global temperatures, which can have a great influence on public health as illustrated in the following image:

Gases in the atmosphere can contribute to climate change both directly and indirectly. Direct effects occur when the gas itself absorbs radiation. Indirect radiative forcing occurs when chemical transformations of the substance produce other greenhouse gases, when a gas influences the atmospheric lifetimes of other gases, and/or when a gas affects atmospheric processes that alter the radiative balance of the earth (e.g., affect cloud formation or albedo). The IPCC developed the Global Warming Potential (GWP) concept to compare the ability of a greenhouse gas to trap heat in the atmosphere relative to another gas. The GWP of a greenhouse gas is defined as the ratio of the accumulated radiative forcing within a specific time horizon caused by emitting 1 kilogram of the gas, relative to that of the reference gas CO2 (IPCC 2013). Therefore GWP-weighted emissions are provided in million metric tons of CO2 equivalent (MMT CO2 Eq.)

CO2 is actually the least capable of the greehouse gases for trapping heat:

However, because CO2 is so much more abundant and stays in the atmosphere so much longer than the other greenhouse gases, it has been the largest contributor to global warming.

See here for more details.

Furthermore, rizing CO2 levels also influence ocean acidity:

This makes it difficult for organisms to maintian their shells or skeletons that are made of calcium carbonate, thus making it more difficult for these organisms to survive and impacting their role in the ecosystem and food chain.

Furthermore, greenhouse gas emissions are believed to influence storm rates.

Indeed events with high levels of precipitation which can induce flooding and property damage are generally increasing around the country:

https://www.epa.gov/climate-indicators/cherry-blossoms

Wrangling the data

Global Data

Yearly CO2 Emissions, 1000 Metric Tonnes

Code

# A tibble: 6 x 265
  country `1751` `1752` `1753` `1754` `1755` `1756` `1757` `1758` `1759`
  <chr>    <dbl>  <dbl>  <dbl>  <dbl>  <dbl>  <dbl>  <dbl>  <dbl>  <dbl>
1 Afghan…     NA     NA     NA     NA     NA     NA     NA     NA     NA
2 Albania     NA     NA     NA     NA     NA     NA     NA     NA     NA
3 Algeria     NA     NA     NA     NA     NA     NA     NA     NA     NA
4 Andorra     NA     NA     NA     NA     NA     NA     NA     NA     NA
5 Angola      NA     NA     NA     NA     NA     NA     NA     NA     NA
6 Antigu…     NA     NA     NA     NA     NA     NA     NA     NA     NA
# … with 255 more variables: `1760` <dbl>, `1761` <dbl>, `1762` <dbl>,
#   `1763` <dbl>, `1764` <dbl>, `1765` <dbl>, `1766` <dbl>, `1767` <dbl>,
#   `1768` <dbl>, `1769` <dbl>, `1770` <dbl>, `1771` <dbl>, `1772` <dbl>,
#   `1773` <dbl>, `1774` <dbl>, `1775` <dbl>, `1776` <dbl>, `1777` <dbl>,
#   `1778` <dbl>, `1779` <dbl>, `1780` <dbl>, `1781` <dbl>, `1782` <dbl>,
#   `1783` <dbl>, `1784` <dbl>, `1785` <dbl>, `1786` <dbl>, `1787` <dbl>,
#   `1788` <dbl>, `1789` <dbl>, `1790` <dbl>, `1791` <dbl>, `1792` <dbl>,
#   `1793` <dbl>, `1794` <dbl>, `1795` <dbl>, `1796` <dbl>, `1797` <dbl>,
#   `1798` <dbl>, `1799` <dbl>, `1800` <dbl>, `1801` <dbl>, `1802` <dbl>,
#   `1803` <dbl>, `1804` <dbl>, `1805` <dbl>, `1806` <dbl>, `1807` <dbl>,
#   `1808` <dbl>, `1809` <dbl>, `1810` <dbl>, `1811` <dbl>, `1812` <dbl>,
#   `1813` <dbl>, `1814` <dbl>, `1815` <dbl>, `1816` <dbl>, `1817` <dbl>,
#   `1818` <dbl>, `1819` <dbl>, `1820` <dbl>, `1821` <dbl>, `1822` <dbl>,
#   `1823` <dbl>, `1824` <dbl>, `1825` <dbl>, `1826` <dbl>, `1827` <dbl>,
#   `1828` <dbl>, `1829` <dbl>, `1830` <dbl>, `1831` <dbl>, `1832` <dbl>,
#   `1833` <dbl>, `1834` <dbl>, `1835` <dbl>, `1836` <dbl>, `1837` <dbl>,
#   `1838` <dbl>, `1839` <dbl>, `1840` <dbl>, `1841` <dbl>, `1842` <dbl>,
#   `1843` <dbl>, `1844` <dbl>, `1845` <dbl>, `1846` <dbl>, `1847` <dbl>,
#   `1848` <dbl>, `1849` <dbl>, `1850` <dbl>, `1851` <dbl>, `1852` <dbl>,
#   `1853` <dbl>, `1854` <dbl>, `1855` <dbl>, `1856` <dbl>, `1857` <dbl>,
#   `1858` <dbl>, `1859` <dbl>, …
           Country               Year CO2 Emissions (Mg) 
       "character"        "character"          "numeric" 
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
   1751    1817    1882    1882    1948    2014 

Yearly Growth in GDP per Capita

Code

Michael Need to determine units for this

# A tibble: 6 x 220
  country   `1801`   `1802`   `1803`   `1804`   `1805`   `1806`   `1807`
  <chr>      <dbl>    <dbl>    <dbl>    <dbl>    <dbl>    <dbl>    <dbl>
1 Afghan… NA       NA       NA       NA       NA       NA       NA      
2 Albania  0.104    0.104    0.104    0.104    0.104    0.104    0.104  
3 Algeria -0.00247 -0.00247 -0.00247 -0.00247 -0.00247 -0.00247 -0.00247
4 Andorra  0.166    0.166    0.166    0.166    0.166    0.166    0.166  
5 Angola   0.425    0.425    0.425    0.425    0.425    0.425    0.425  
6 Antigu… NA       NA       NA       NA       NA       NA       NA      
# … with 212 more variables: `1808` <dbl>, `1809` <dbl>, `1810` <dbl>,
#   `1811` <dbl>, `1812` <dbl>, `1813` <dbl>, `1814` <dbl>, `1815` <dbl>,
#   `1816` <dbl>, `1817` <dbl>, `1818` <dbl>, `1819` <dbl>, `1820` <dbl>,
#   `1821` <dbl>, `1822` <dbl>, `1823` <dbl>, `1824` <dbl>, `1825` <dbl>,
#   `1826` <dbl>, `1827` <dbl>, `1828` <dbl>, `1829` <dbl>, `1830` <dbl>,
#   `1831` <dbl>, `1832` <dbl>, `1833` <dbl>, `1834` <dbl>, `1835` <dbl>,
#   `1836` <dbl>, `1837` <dbl>, `1838` <dbl>, `1839` <dbl>, `1840` <dbl>,
#   `1841` <dbl>, `1842` <dbl>, `1843` <dbl>, `1844` <dbl>, `1845` <dbl>,
#   `1846` <dbl>, `1847` <dbl>, `1848` <dbl>, `1849` <dbl>, `1850` <dbl>,
#   `1851` <dbl>, `1852` <dbl>, `1853` <dbl>, `1854` <dbl>, `1855` <dbl>,
#   `1856` <dbl>, `1857` <dbl>, `1858` <dbl>, `1859` <dbl>, `1860` <dbl>,
#   `1861` <dbl>, `1862` <dbl>, `1863` <dbl>, `1864` <dbl>, `1865` <dbl>,
#   `1866` <dbl>, `1867` <dbl>, `1868` <dbl>, `1869` <dbl>, `1870` <dbl>,
#   `1871` <dbl>, `1872` <dbl>, `1873` <dbl>, `1874` <dbl>, `1875` <dbl>,
#   `1876` <dbl>, `1877` <dbl>, `1878` <dbl>, `1879` <dbl>, `1880` <dbl>,
#   `1881` <dbl>, `1882` <dbl>, `1883` <dbl>, `1884` <dbl>, `1885` <dbl>,
#   `1886` <dbl>, `1887` <dbl>, `1888` <dbl>, `1889` <dbl>, `1890` <dbl>,
#   `1891` <dbl>, `1892` <dbl>, `1893` <dbl>, `1894` <dbl>, `1895` <dbl>,
#   `1896` <dbl>, `1897` <dbl>, `1898` <dbl>, `1899` <dbl>, `1900` <dbl>,
#   `1901` <dbl>, `1902` <dbl>, `1903` <dbl>, `1904` <dbl>, `1905` <dbl>,
#   `1906` <dbl>, `1907` <dbl>, …
              Country                  Year GDP Growth/Capita (%) 
          "character"           "character"             "numeric" 
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
   1801    1863    1915    1915    1967    2019 

Energy Use per Person

Code

# A tibble: 6 x 57
  country `1960` `1961` `1962` `1963` `1964` `1965` `1966` `1967` `1968`
  <chr>    <dbl>  <dbl>  <dbl>  <dbl>  <dbl>  <dbl>  <dbl>  <dbl>  <dbl>
1 Albania     NA     NA     NA     NA     NA     NA     NA     NA     NA
2 Algeria     NA     NA     NA     NA     NA     NA     NA     NA     NA
3 Angola      NA     NA     NA     NA     NA     NA     NA     NA     NA
4 Antigu…     NA     NA     NA     NA     NA     NA     NA     NA     NA
5 Argent…     NA     NA     NA     NA     NA     NA     NA     NA     NA
6 Armenia     NA     NA     NA     NA     NA     NA     NA     NA     NA
# … with 47 more variables: `1969` <dbl>, `1970` <dbl>, `1971` <dbl>,
#   `1972` <dbl>, `1973` <dbl>, `1974` <dbl>, `1975` <dbl>, `1976` <dbl>,
#   `1977` <dbl>, `1978` <dbl>, `1979` <dbl>, `1980` <dbl>, `1981` <dbl>,
#   `1982` <dbl>, `1983` <dbl>, `1984` <dbl>, `1985` <dbl>, `1986` <dbl>,
#   `1987` <dbl>, `1988` <dbl>, `1989` <dbl>, `1990` <dbl>, `1991` <dbl>,
#   `1992` <dbl>, `1993` <dbl>, `1994` <dbl>, `1995` <dbl>, `1996` <dbl>,
#   `1997` <dbl>, `1998` <dbl>, `1999` <dbl>, `2000` <dbl>, `2001` <dbl>,
#   `2002` <dbl>, `2003` <dbl>, `2004` <dbl>, `2005` <dbl>, `2006` <dbl>,
#   `2007` <dbl>, `2008` <dbl>, `2009` <dbl>, `2010` <dbl>, `2011` <dbl>,
#   `2012` <dbl>, `2013` <dbl>, `2014` <dbl>, `2015` <dbl>
                        Country                            Year 
                    "character"                     "character" 
Energy Use (kg, oil-eq./capita) 
                      "numeric" 
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
   1960    1974    1988    1988    2001    2015 

Crude Mortality Rate

Code

# A tibble: 6 x 64
  `Data Source` `World Developm… ...3  ...4  ...5  ...6  ...7  ...8  ...9 
  <chr>         <chr>            <chr> <chr> <chr> <chr> <chr> <chr> <chr>
1 Last Updated… 43819            <NA>  <NA>  <NA>  <NA>  <NA>  <NA>  <NA> 
2 <NA>          <NA>             <NA>  <NA>  <NA>  <NA>  <NA>  <NA>  <NA> 
3 Country Name  Country Code     Indi… Indi… 1960  1961  1962  1963  1964 
4 Aruba         ABW              Deat… SP.D… 6.38… 6.24… 6.11… 6.01… 5.91…
5 Afghanistan   AFG              Deat… SP.D… 32.2… 31.6… 31.0… 30.5… 30.0…
6 Angola        AGO              Deat… SP.D… 27.0… 26.8… 26.6… 26.4… 26.1…
# … with 55 more variables: ...10 <chr>, ...11 <chr>, ...12 <chr>,
#   ...13 <chr>, ...14 <chr>, ...15 <chr>, ...16 <chr>, ...17 <chr>,
#   ...18 <chr>, ...19 <chr>, ...20 <chr>, ...21 <chr>, ...22 <chr>,
#   ...23 <chr>, ...24 <chr>, ...25 <chr>, ...26 <chr>, ...27 <chr>,
#   ...28 <chr>, ...29 <chr>, ...30 <chr>, ...31 <chr>, ...32 <chr>,
#   ...33 <chr>, ...34 <chr>, ...35 <chr>, ...36 <chr>, ...37 <chr>,
#   ...38 <chr>, ...39 <chr>, ...40 <chr>, ...41 <chr>, ...42 <chr>,
#   ...43 <chr>, ...44 <chr>, ...45 <chr>, ...46 <chr>, ...47 <chr>,
#   ...48 <chr>, ...49 <chr>, ...50 <chr>, ...51 <chr>, ...52 <chr>,
#   ...53 <chr>, ...54 <chr>, ...55 <chr>, ...56 <chr>, ...57 <chr>,
#   ...58 <chr>, ...59 <chr>, ...60 <chr>, ...61 <chr>, ...62 <chr>,
#   ...63 <chr>, ...64 <chr>
           Country               Year Deaths/1000 People 
       "character"        "character"        "character" 
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
   1960    1975    1990    1990    2004    2019 

Analysis dataframe

[1] "Country"            "Year"               "CO2 Emissions (Mg)"
[1] "Country"               "Year"                  "GDP Growth/Capita (%)"
[1] "Country"                         "Year"                           
[3] "Energy Use (kg, oil-eq./capita)"
[1] "Country"            "Year"               "Deaths/1000 People"
[1] TRUE
[1] TRUE
    Country        Year   Indicator       Value      Region        Type 
"character" "character" "character"   "numeric" "character" "character" 
    Country        Year   Indicator       Value      Region        Type 
   "factor"   "numeric" "character"   "numeric" "character" "character" 

Subsetting the data

US-specific

Main plot

quartz_off_screen 
                2 
LS0tCnRpdGxlOiAiT3BlbiBDYXNlIFN0dWRpZXMgOiBDTzIgRW1taXNzaW9ucyBPdmVyIFRpbWUiCmF1dGhvcjogIk1pY2hhZWwgT250aXZlcm9zLCBDYXJyaWUgV3JpZ2h0LCBQaEQuIgpjc3M6IHN0eWxlLmNzcwpvdXRwdXQ6CiAgaHRtbF9kb2N1bWVudDoKICAgIHNlbGZfY29udGFpbmVkOiB5ZXMKICAgIGNvZGVfZG93bmxvYWQ6IHllcwogICAgaGlnaGxpZ2h0OiB0YW5nbwogICAgbnVtYmVyX3NlY3Rpb25zOiBubwogICAgdGhlbWU6IGNvc21vCiAgICB0b2M6IHllcwogICAgdG9jX2Zsb2F0OiB5ZXMKICBwZGZfZG9jdW1lbnQ6CiAgICB0b2M6IHllcwogIHdvcmRfZG9jdW1lbnQ6CiAgICB0b2M6IHllcwotLS0KCjxzdHlsZT4KI1RPQyB7CiAgYmFja2dyb3VuZDogdXJsKCJodHRwczovL29wZW5jYXNlc3R1ZGllcy5naXRodWIuaW8vaW1nL2xvZ28uanBnIik7CiAgYmFja2dyb3VuZC1zaXplOiBjb250YWluOwogIHBhZGRpbmctdG9wOiAyNDBweCAhaW1wb3J0YW50OwogIGJhY2tncm91bmQtcmVwZWF0OiBuby1yZXBlYXQ7Cn0KPC9zdHlsZT4KCmBgYHtyIHNldHVwLCBpbmNsdWRlPUZBTFNFfQprbml0cjo6b3B0c19jaHVuayRzZXQoaW5jbHVkZSA9IFRSVUUsIGNvbW1lbnQgPSBOQSwgZWNobyA9IFRSVUUsCiAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlID0gRkFMU0UsIHdhcm5pbmcgPSBGQUxTRSwgY2FjaGUgPSBGQUxTRSwKICAgICAgICAgICAgICAgICAgICAgIGZpZy5hbGlnbiA9ICJjZW50ZXIiLCBvdXQud2lkdGggPSAnOTAlJykKbGlicmFyeShoZXJlKQpsaWJyYXJ5KGtuaXRyKQpgYGAKCiMjIyMgey5vdXRsaW5lIH0KYGBge3IsIGVjaG8gPSBGQUxTRSwgb3V0LndpZHRoID0gIjgwMCBweCJ9CmtuaXRyOjppbmNsdWRlX2dyYXBoaWNzKGhlcmU6OmhlcmUoImltZyIsICJtYWlucGxvdC5wbmciKSkKYGBgCgojIyMjCgojIyB7LmRpc2NsYWltZXJfYmxvY2t9CgoqKkRpc2NsYWltZXIqKjogVGhlIHB1cnBvc2Ugb2YgdGhlIFtPcGVuIENhc2UgU3R1ZGllc10oaHR0cHM6Ly9vcGVuY2FzZXN0dWRpZXMuZ2l0aHViLmlvKXt0YXJnZXQ9Il9ibGFuayJ9IHByb2plY3QgaXMgKip0byBkZW1vbnN0cmF0ZSB0aGUgdXNlIG9mIHZhcmlvdXMgZGF0YSBzY2llbmNlIG1ldGhvZHMsIHRvb2xzLCBhbmQgc29mdHdhcmUgaW4gdGhlIGNvbnRleHQgb2YgbWVzc3ksIHJlYWwtd29ybGQgZGF0YSoqLiBBIGdpdmVuIGNhc2Ugc3R1ZHkgZG9lcyBub3QgY292ZXIgYWxsIGFzcGVjdHMgb2YgdGhlIHJlc2VhcmNoIHByb2Nlc3MsIGlzIG5vdCBjbGFpbWluZyB0byBiZSB0aGUgbW9zdCBhcHByb3ByaWF0ZSB3YXkgdG8gYW5hbHl6ZSBhIGdpdmVuIGRhdGEgc2V0LCBhbmQgc2hvdWxkIG5vdCBiZSB1c2VkIGluIHRoZSBjb250ZXh0IG9mIG1ha2luZyBwb2xpY3kgZGVjaXNpb25zIHdpdGhvdXQgZXh0ZXJuYWwgY29uc3VsdGF0aW9uIGZyb20gc2NpZW50aWZpYyBleHBlcnRzLiAKCiMjICoqTW90aXZhdGlvbioqCioqKiAKClRoaXMgYW5hbHlzaXMgZXhwbG9yZXMgaG93IGRpZmZlcmVudCBjb3VudHJpZXMgaGF2ZSBjb250cmlidXRlZCB0byBDYXJib24gRGlveGlkZSAoQ08yKSBlbWlzc2lvbnMgb3ZlciB0aW1lIGFuZCBob3cgQ08yIGVtaXNzaW9uIHJhdGVzIG1heSByZWxhdGUgdG8gaW5jcmVhc2luZyBnbG9iYWwgdGVtcGVyYXR1cmVzIGFuZCBpbmNyZWFzZWQgcmF0ZXMgb2YgbmF0dXJhbCBkaXNhc3RlciBhbmQgc3Rvcm1zLiBUaGlzIHJlcG9ydCBwcm92aWRlcyBhIGJhc2lzIGZvciB0aGUgbW90aXZhdGlvbjogaHR0cHM6Ly93d3cuZXBhLmdvdi9yZXBvcnQtZW52aXJvbm1lbnQvZ3JlZW5ob3VzZS1nYXNlcy4KCgpDTzIgbWFrZXMgdXAgdGhlIGxhcmdlc3QgcHJvcG9ydGlvbiBvZiBncmVlbmhvdXNlIGdhcyBlbWlzc2lvbnMgaW4gdGhlIFVuaXRlZCBTdGF0ZXM6CgoKYGBge3IsIGVjaG8gPSBGQUxTRSwgb3V0LndpZHRoPSI1MDBweCJ9CmtuaXRyOjppbmNsdWRlX2dyYXBoaWNzKGhlcmU6OmhlcmUoImltZyIsICJlbWlzc2lvbnMuanBnIikpCmBgYAoKQSB2YXJpZXR5IG9mIHNvdXJjZXMgYW5kIHNlY3RvcnMgY29udHJpYnV0ZSB0byBncmVlbmhvdXNlIGdhcyBlbWlzc2lvbnM6CgoKYGBge3IsIGVjaG8gPSBGQUxTRSwgb3V0LndpZHRoPSI2MDBweCJ9CmtuaXRyOjppbmNsdWRlX2dyYXBoaWNzKGhlcmU6OmhlcmUoImltZyIsICJzZWN0b3IucG5nIikpCmBgYAoKU28gd2h5IHNob3VsZCB3ZSBwYXkgYXR0ZW50aW9uIHRvIGdyZWVuaG91c2UgZ2FzZXM/CgpBY2NvcmRpbmcgdG8gdGhlIFtVUyBFbnZpcm9ubWVudGFsIFByb3RlY3Rpb24gQWdlbmN5IChFUEEpIEludmVudG9yeSBvZiBVLlMuIEdyZWVuaG91c2UgR2FzIEVtaXNzaW9ucyBhbmQgU2lua3MgMjAyMCBSZXBvcnRdKGh0dHBzOi8vd3d3LmVwYS5nb3YvZ2hnZW1pc3Npb25zL2ludmVudG9yeS11cy1ncmVlbmhvdXNlLWdhcy1lbWlzc2lvbnMtYW5kLXNpbmtzKTogCgo+IEdyZWVuaG91c2UgZ2FzZXMgYWJzb3JiIGluZnJhcmVkIHJhZGlhdGlvbiwgdGhlcmVieSB0cmFwcGluZyBoZWF0IGluIHRoZSBhdG1vc3BoZXJlIGFuZCBtYWtpbmcgdGhlIHBsYW5ldCB3YXJtZXIuIFRoZSBtb3N0IGltcG9ydGFudCBncmVlbmhvdXNlIGdhc2VzIGRpcmVjdGx5IGVtaXR0ZWQgYnkgaHVtYW5zIGluY2x1ZGUgY2FyYm9uIGRpb3hpZGUgKENPMiksIG1ldGhhbmUgKENINCksIG5pdHJvdXMgb3hpZGUgKE4yTyksIGFuZCBzZXZlcmFsIGZsdW9yaW5lLWNvbnRhaW5pbmcgaGFsb2dlbmF0ZWQgc3Vic3RhbmNlcy4gQWx0aG91Z2ggQ08yLCBDSDQsIGFuZCBOMk8gb2NjdXIgbmF0dXJhbGx5IGluIHRoZSBhdG1vc3BoZXJlLCBodW1hbiBhY3Rpdml0aWVzIGhhdmUgY2hhbmdlZCB0aGVpciBhdG1vc3BoZXJpYyBjb25jZW50cmF0aW9ucy4gRnJvbSB0aGUgcHJlLSBpbmR1c3RyaWFsIGVyYSAoaS5lLiwgZW5kaW5nIGFib3V0IDE3NTApIHRvIDIwMTgsIGNvbmNlbnRyYXRpb25zIG9mIHRoZXNlIGdyZWVuaG91c2UgZ2FzZXMgaGF2ZSBpbmNyZWFzZWQgZ2xvYmFsbHkgYnkgNDYsIDE2NSwgYW5kIDIzIHBlcmNlbnQsIHJlc3BlY3RpdmVseSAoSVBDQyAyMDEzOyBOT0FBL0VTUkwgMjAxOWEsIDIwMTliLCAyMDE5YykuCgpUaGVyZSBhcmUgbWFueSBzaWducyB0aGF0IG91ciBwbGFuZXQgaXMgZXhwZXJpZW5jaW5nIHdhcm1lciB0ZW1wZXJhdHVyZXM6CgpgYGB7ciwgZWNobyA9IEZBTFNFLCBvdXQud2lkdGg9IjYwMHB4In0Ka25pdHI6OmluY2x1ZGVfZ3JhcGhpY3MoaGVyZTo6aGVyZSgiaW1nIiwgIndhcm1pbmcucG5nIikpCmBgYAoKVGhlIGNvbm5lY3Rpb24gYmV0d2VlbiBncmVlbmhvdXNlIGdhcyBsZXZlbHMgYW5kIGdsb2JhbCB0ZW1wZXJhdHVyZXMgYW5kIHRoZSBpbmZsdWVuY2Ugb2YgaW5jcmVhc2VkIGdsb2JhbCB0ZW1wZXJhdHVyZXMgb24gaHVtYW4gaGVhbHRoIGFyZSBtb3RpdmF0ZWQgYnkgdGhlc2UgcmVwb3J0czoKCiMjIyMgey5yZWZlcmVuY2VfYmxvY2t9CgpNZWxpbGxvLCBKLk0uLCBULkMuIFJpY2htb25kLCBhbmQgRy5XLiBZb2hlIChlZHMuKS4gMjAxNC4gQ2xpbWF0ZSBjaGFuZ2UgaW1wYWN0cyBpbiB0aGUgVW5pdGVkIFN0YXRlczogVGhlIHRoaXJkIE5hdGlvbmFsIENsaW1hdGUgQXNzZXNzbWVudC4gVS5TLiBHbG9iYWwgQ2hhbmdlIFJlc2VhcmNoIFByb2dyYW0uICAKCjIwMjAuIOKAnEludmVudG9yeSBvZiBVUyBHcmVlbmhvdXNlIEdhcyBFbWlzc2lvbnMgYW5kIFNpbmtzOiAxOTkwLS0yMDE4LuKAnSBFUEEgNDMwLVItMjAtMDAyLCBUZWNoLiBSZXAuIGh0dHBzOi8vd3d3LmVwYS5nb3YvZ2hnZW1pc3Npb25zL2ludmVudG9yeS11cy1ncmVlbmhvdXNlLWdhcy1lbWlzc2lvbnMtYW5kLXNpbmtzLgoKCiMjIyMKClRoZSBOYXRpb25hbCBDbGltYXRlIEFzc2Vzc21lbnQgUmVwb3J0IHN0YXRlcyB0aGF0OgoKPiBIZWF0LXRyYXBwaW5nIGdhc2VzIGFscmVhZHkgaW4gdGhlIGF0bW9zcGhlcmUgaGF2ZSBjb21taXR0ZWQgdXMgdG8gYSBob3R0ZXIgZnV0dXJlIHdpdGggbW9yZSBjbGltYXRlLXJlbGF0ZWQgaW1wYWN0cyBvdmVyIHRoZSBuZXh0IGZldyBkZWNhZGVzLiBUaGUgbWFnbml0dWRlIG9mIGNsaW1hdGUgY2hhbmdlIGJleW9uZCB0aGUgbmV4dCBmZXcgZGVjYWRlcyBkZXBlbmRzIHByaW1hcmlseSBvbiB0aGUgYW1vdW50IG9mIGhlYXQtdHJhcHBpbmcgZ2FzZXMgdGhhdCBodW1hbiBhY3Rpdml0aWVzIGVtaXQgZ2xvYmFsbHksIG5vdyBhbmQgaW4gdGhlIGZ1dHVyZQoKU2VlIFtoZXJlXShodHRwczovL3d3dy5lcGEuZ292L3JlcG9ydC1lbnZpcm9ubWVudC9ncmVlbmhvdXNlLWdhc2VzKSBhbmQgW2hlcmVdKGh0dHBzOi8vd29ybGQxMDEuY2ZyLm9yZy9nbG9iYWwtZXJhLWlzc3Vlcy9jbGltYXRlLWNoYW5nZS9jbGltYXRlLWNoYW5nZS1hZGFwdGF0aW9ucykgZm9yIG1vcmUgaW5mb3JtYXRpb24uCgojIyAqKk1haW4gUXVlc3Rpb25zKioKKioqIAoKIyMjIyB7Lm1haW5fcXVlc3Rpb25fYmxvY2t9CjxiPjx1PiBPdXIgbWFpbiBxdWVzdGlvbjogPC91PjwvYj4KCjEpIEhvdyBoYXZlIGdsb2JhbCBDTzIgZW1pc3Npb24gcmF0ZXMgY2hhbmdlZCBvdmVyIHRpbWU/IEluIHBhcnRpY3VsYXIgZm9yIHRoZSBVUywgYW5kIGhvdyBkb2VzIHRoZSBVUyBjb21wYXJlIHRvIG90aGVyIGNvdW50cmllcz8gCjIpIEFyZSBVUyBDTzIgZW1pc3Npb25zLCBnbG9iYWwgdGVtcGVyYXR1cmVzLCBhbmQgVVMgc3Rvcm0gcmF0ZXMgYXNzb2NpYXRlZD8gCgojIyMjCgojIyAqKkxlYXJuaW5nIE9iamVjdGl2ZXMqKiAKKioqIAoKSW4gdGhpcyBjYXNlIHN0dWR5LCB3ZSB3aWxsIGV4cGxvcmUgQ08yIGVtaXNzaW9uIGRhdGEgZnJvbSBhcm91bmQgdGhlIHdvcmxkLiBXZSB3aWxsIGFsc28gZm9jdXMgb24gdGhlIFVTIHNwZWNpZmljYWxseSB0byBldmFsdWF0ZSBwYXR0ZXJucyBvZiB0ZW1wZXJhdHVyZXMgYW5kIHN0b3JtIGFjdGl2aXR5LiBUaGlzIGNhc2Ugc3R1ZHkgd2lsbCBwYXJ0aWN1YXJseSBmb2N1cyBvbiB2aXN1YWxpemF0aW9ucyBvZiBwYXR0ZXJucyBvdmVyIHRpbWUuIFdlIHdpbGwgZXNwZWNpYWxseSBmb2N1cyBvbiB1c2luZyBwYWNrYWdlcyBhbmQgZnVuY3Rpb25zIGZyb20gdGhlIFtgVGlkeXZlcnNlYF0oaHR0cHM6Ly93d3cudGlkeXZlcnNlLm9yZy8pe3RhcmdldD0iX2JsYW5rIn0sIHN1Y2ggYXMgYHBsb3RseWBhbmQgYGdnYW5pbWF0ZWAuIFRoZSB0aWR5dmVyc2UgaXMgYSBsaWJyYXJ5IG9mIHBhY2thZ2VzIGNyZWF0ZWQgYnkgUlN0dWRpby4gV2hpbGUgc29tZSBzdHVkZW50cyBtYXkgYmUgZmFtaWxpYXIgd2l0aCBwcmV2aW91cyBSIHByb2dyYW1taW5nIHBhY2thZ2VzLCB0aGVzZSBwYWNrYWdlcyBtYWtlIGRhdGEgc2NpZW5jZSBpbiBSIGVzcGVjaWFsbHkgZWZmaWNpZW50LgoKCioqKiAKCgpXZSB3aWxsIGJlZ2luIGJ5IGxvYWRpbmcgdGhlIHBhY2thZ2VzIHRoYXQgd2Ugd2lsbCBuZWVkOgoKYGBge3J9CmxpYnJhcnkoaGVyZSkKbGlicmFyeSh0aWR5dmVyc2UpCmxpYnJhcnkocmVhZHhsKQpsaWJyYXJ5KHBsb3RseSkKbGlicmFyeShnZ2FuaW1hdGUpCmxpYnJhcnkoUkNvbG9yQnJld2VyKQpgYGAKCgogUGFja2FnZSAgIHwgVXNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotLS0tLS0tLS0tIHwtLS0tLS0tLS0tLS0tCltoZXJlXShodHRwczovL2dpdGh1Yi5jb20vamVubnliYy9oZXJlX2hlcmUpe3RhcmdldD0iX2JsYW5rIn0gICAgICAgfCB0byBlYXNpbHkgbG9hZCBhbmQgc2F2ZSBkYXRhClt0aWR5dmVyc2VdKGh0dHBzOi8vd3d3LnRpZHl2ZXJzZS5vcmcvcGFja2FnZXMvKSB8IHRvIHdyYW5nbGUgdGhlIGRhdGEgYW5kIGNyZWF0ZSBnZ3Bsb3QyIHBsb3RzCltyZWFkeGxdKGh0dHBzOi8vcmVhZHhsLnRpZHl2ZXJzZS5vcmcvKSB8IHRvIGltcG9ydCB0aGUgRXhjZWwgZmlsZSBkYXRhCltwbG90eWx5XShodHRwczovL3Bsb3RseS5jb20vci8pIHwgdG8gbWFrZSB0aGUgdmlzdWFsaXphdGlvbnMKW2dnYW5pbWF0ZV0oaHR0cHM6Ly9nZ2FuaW1hdGUuY29tLykgfCB0byBtYWtlIHRoZSBwbG90cyBpbnRlcmFjdGl2ZQpbUkNvbG9yQnJld2VyXShodHRwczovL2NyYW4uci1wcm9qZWN0Lm9yZy93ZWIvcGFja2FnZXMvUkNvbG9yQnJld2VyL2luZGV4Lmh0bWwpIHwgdG8gaGF2ZSBncmVhdGVyIGNvbnRyb2wgb3ZlciB0aGUgY29sb3IgaW4gb3VyIHBsb3RzCgpUaGUgZmlyc3QgdGltZSB3ZSB1c2UgYSBmdW5jdGlvbiwgd2Ugd2lsbCB1c2UgdGhlIGA6OmAgdG8gaW5kaWNhdGUgd2hpY2ggcGFja2FnZSB3ZSBhcmUgdXNpbmcuIFVubGVzcyB3ZSBoYXZlIG92ZXJsYXBwaW5nIGZ1bmN0aW9uIG5hbWVzLCB0aGlzIGlzIG5vdCBuZWNlc3NhcnksIGJ1dCB3ZSB3aWxsIGluY2x1ZGUgaXQgaGVyZSB0byBiZSBpbmZvcm1hdGl2ZSBhYm91dCB3aGVyZSB0aGUgZnVuY3Rpb25zIHdlIHdpbGwgdXNlIGNvbWUgZnJvbS4KCgojIyAqKkNvbnRleHQqKgoqKiogCgpHcmVlbmhvdXNlIGdhcyBlbWlzc2lvbnMgYXJlIGR1ZSB0byBib3RoIG5hdHVyYWwgcHJvY2Vzc2VzIGFuZCBhbnRyb3BvZ2VuaWMgKGh1bWFuLWRlcml2ZWQpIGFjdGl2aXRpZXMuIAoKVGhlc2UgZW1pc3Npb25zIGFyZSBvbmUgb2YgdGhlIGNvbnRyaWJ1dGluZyBmYWN0b3JzIHRvIHJpc2luZyBnbG9iYWwgdGVtcGVyYXR1cmVzLCB3aGljaCBjYW4gaGF2ZSBhIGdyZWF0IGluZmx1ZW5jZSBvbiBbcHVibGljIGhlYWx0aF0oaHR0cHM6Ly93d3cuZXBhLmdvdi9jbGltYXRlLWluZGljYXRvcnMvdW5kZXJzdGFuZGluZy1jb25uZWN0aW9ucy1iZXR3ZWVuLWNsaW1hdGUtY2hhbmdlLWFuZC1odW1hbi1oZWFsdGgpIGFzIGlsbHVzdHJhdGVkIGluIHRoZSBmb2xsb3dpbmcgaW1hZ2U6CgpgYGB7ciwgZWNobyA9IEZBTFNFLCBvdXQud2lkdGg9IjgwMHB4In0Ka25pdHI6OmluY2x1ZGVfZ3JhcGhpY3MoaGVyZTo6aGVyZSgiaW1nIiwgImhlYWx0aC5wbmciKSkKYGBgCgo+IEdhc2VzIGluIHRoZSBhdG1vc3BoZXJlIGNhbiBjb250cmlidXRlIHRvIGNsaW1hdGUgY2hhbmdlIGJvdGggZGlyZWN0bHkgYW5kIGluZGlyZWN0bHkuIERpcmVjdCBlZmZlY3RzIG9jY3VyIHdoZW4gdGhlIGdhcyBpdHNlbGYgYWJzb3JicyByYWRpYXRpb24uIEluZGlyZWN0IHJhZGlhdGl2ZSBmb3JjaW5nIG9jY3VycyB3aGVuIGNoZW1pY2FsIHRyYW5zZm9ybWF0aW9ucyBvZiB0aGUgc3Vic3RhbmNlIHByb2R1Y2Ugb3RoZXIgZ3JlZW5ob3VzZSBnYXNlcywgd2hlbiBhIGdhcyBpbmZsdWVuY2VzIHRoZSBhdG1vc3BoZXJpYyBsaWZldGltZXMgb2Ygb3RoZXIgZ2FzZXMsIGFuZC9vciB3aGVuIGEgZ2FzIGFmZmVjdHMgYXRtb3NwaGVyaWMgcHJvY2Vzc2VzIHRoYXQgYWx0ZXIgdGhlIHJhZGlhdGl2ZSBiYWxhbmNlIG9mIHRoZSBlYXJ0aCAoZS5nLiwgYWZmZWN0IGNsb3VkIGZvcm1hdGlvbiBvciBhbGJlZG8pLiBUaGUgSVBDQyBkZXZlbG9wZWQgdGhlIEdsb2JhbCBXYXJtaW5nIFBvdGVudGlhbCAoR1dQKSBjb25jZXB0IHRvIGNvbXBhcmUgdGhlIGFiaWxpdHkgb2YgYSBncmVlbmhvdXNlIGdhcyB0byB0cmFwIGhlYXQgaW4gdGhlIGF0bW9zcGhlcmUgcmVsYXRpdmUgdG8gYW5vdGhlciBnYXMuClRoZSBHV1Agb2YgYSBncmVlbmhvdXNlIGdhcyBpcyBkZWZpbmVkIGFzIHRoZSByYXRpbyBvZiB0aGUgYWNjdW11bGF0ZWQgcmFkaWF0aXZlIGZvcmNpbmcgd2l0aGluIGEgc3BlY2lmaWMgdGltZSBob3Jpem9uIGNhdXNlZCBieSBlbWl0dGluZyAxIGtpbG9ncmFtIG9mIHRoZSBnYXMsIHJlbGF0aXZlIHRvIHRoYXQgb2YgdGhlIHJlZmVyZW5jZSBnYXMgQ08yIChJUENDIDIwMTMpLiBUaGVyZWZvcmUgR1dQLXdlaWdodGVkIGVtaXNzaW9ucyBhcmUgcHJvdmlkZWQgaW4gbWlsbGlvbiBtZXRyaWMgdG9ucyBvZiBDTzIgZXF1aXZhbGVudCAoTU1UIENPMiBFcS4pCgoKIENPMiBpcyBhY3R1YWxseSB0aGUgbGVhc3QgY2FwYWJsZSBvZiB0aGUgZ3JlZWhvdXNlIGdhc2VzIGZvciB0cmFwcGluZyBoZWF0OgoKYGBge3IsIGVjaG8gPSBGQUxTRSwgb3V0LndpZHRoPSI4MDBweCJ9CmtuaXRyOjppbmNsdWRlX2dyYXBoaWNzKGhlcmU6OmhlcmUoImltZyIsICJHV1AucG5nIikpCmBgYAoKSG93ZXZlciwgYmVjYXVzZSBDTzIgaXMgc28gbXVjaCBtb3JlIGFidW5kYW50IGFuZCBzdGF5cyBpbiB0aGUgYXRtb3NwaGVyZSBzbyBtdWNoIGxvbmdlciB0aGFuIHRoZSBvdGhlciBncmVlbmhvdXNlIGdhc2VzLCBpdCBoYXMgYmVlbiB0aGUgbGFyZ2VzdCBjb250cmlidXRvciB0byBnbG9iYWwgd2FybWluZy4KClNlZSBbaGVyZV0oaHR0cHM6Ly93d3cudWNzdXNhLm9yZy9yZXNvdXJjZXMvd2h5LWRvZXMtY28yLWdldC1tb3JlLWF0dGVudGlvbi1vdGhlci1nYXNlcyM6fjp0ZXh0PUNPMiUyMHN0aWNrcyUyMGFyb3VuZCxveGlkZSUyMChOMk8pLikKZm9yIG1vcmUgZGV0YWlscy4KCgpGdXJ0aGVybW9yZSwgcml6aW5nIENPMiBsZXZlbHMgYWxzbyBpbmZsdWVuY2Ugb2NlYW4gYWNpZGl0eToKCmBgYHtyLCBlY2hvID0gRkFMU0UsIG91dC53aWR0aD0iNTAwcHgifQprbml0cjo6aW5jbHVkZV9ncmFwaGljcyhoZXJlOjpoZXJlKCJpbWciLCAib2NlYW5zLnBuZyIpKQpgYGAKClRoaXMgbWFrZXMgaXQgZGlmZmljdWx0IGZvciBvcmdhbmlzbXMgdG8gbWFpbnRpYW4gdGhlaXIgc2hlbGxzIG9yIHNrZWxldG9ucyB0aGF0IGFyZSBtYWRlIG9mIGNhbGNpdW0gY2FyYm9uYXRlLCB0aHVzIG1ha2luZyBpdCBtb3JlIGRpZmZpY3VsdCBmb3IgdGhlc2Ugb3JnYW5pc21zIHRvIHN1cnZpdmUgYW5kIGltcGFjdGluZyB0aGVpciByb2xlIGluIHRoZSBlY29zeXN0ZW0gYW5kIGZvb2QgY2hhaW4uIAoKCkZ1cnRoZXJtb3JlLCBncmVlbmhvdXNlIGdhcyBlbWlzc2lvbnMgYXJlIGJlbGlldmVkIHRvIGluZmx1ZW5jZSBzdG9ybSByYXRlcy4gCgpJbmRlZWQgZXZlbnRzIHdpdGggaGlnaCBsZXZlbHMgb2YgcHJlY2lwaXRhdGlvbiB3aGljaCBjYW4gaW5kdWNlIGZsb29kaW5nIGFuZCBwcm9wZXJ0eSBkYW1hZ2UgYXJlIGdlbmVyYWxseSBpbmNyZWFzaW5nIGFyb3VuZCB0aGUgY291bnRyeToKCmBgYHtyLCBlY2hvID0gRkFMU0UsIG91dC53aWR0aD0iNTAwcHgifQprbml0cjo6aW5jbHVkZV9ncmFwaGljcyhoZXJlOjpoZXJlKCJpbWciLCAic3Rvcm1zLnBuZyIpKQpgYGAKCmh0dHBzOi8vd3d3LmVwYS5nb3YvY2xpbWF0ZS1pbmRpY2F0b3JzL2NoZXJyeS1ibG9zc29tcwoKIyMgV3JhbmdsaW5nIHRoZSBkYXRhCgojIyMgR2xvYmFsIERhdGEKCiMjIyBZZWFybHkgQ09+Mn4gRW1pc3Npb25zLCAxMDAwIE1ldHJpYyBUb25uZXMgCgojIyMjIFNvdXJjZQoKW0NsaWNrIGhlcmUgdG8gYmUgcmVkaXJlY3RlZCB0byB0aGUgc291cmNlIGZyb20gd2hpY2ggd2Ugb2J0YWluZWQgdGhpcyBkYXRhc2V0XShodHRwczovL3d3dy5nYXBtaW5kZXIub3JnL2RhdGEvKQoKW0NsaWNrIGhlcmUgdG8gYmUgcmVkaXJlY3RlZCB0byB0aGUgZGlyZWN0IHNvdXJjZSBmb3IgdGhpcyBkYXRhc2V0XShodHRwczovL2NkaWFjLmVzcy1kaXZlLmxibC5nb3YvKQoKIyMjIyBDb2RlCgpgYGB7cn0KbGlicmFyeShoZXJlKQpDTzJfZW1pc3Npb25zIDwtIHJlYWRfZXhjZWwoaGVyZSgiZG9jcy95ZWFybHlfY28yX2VtaXNzaW9uc18xMDAwX3Rvbm5lcy54bHN4IikpCgpoZWFkKENPMl9lbWlzc2lvbnMpCgpDTzJfZW1pc3Npb25zIDwtIENPMl9lbWlzc2lvbnMgJT4lCiAgZ2F0aGVyKGtleSA9IFllYXIsIHZhbHVlID0gRW1pc3Npb25zLCAtY291bnRyeSkgJT4lCiAgcmVuYW1lKENvdW50cnk9Y291bnRyeSkgJT4lCiAgbXV0YXRlKEVtaXNzaW9ucyA9IEVtaXNzaW9ucy8xMDAwKSAlPiUKICByZW5hbWUoYENPMiBFbWlzc2lvbnMgKE1nKWA9RW1pc3Npb25zKQoKc2FwcGx5KENPMl9lbWlzc2lvbnMsIGNsYXNzKQoKQ08yX2VtaXNzaW9ucyRZZWFyIDwtIGFzLm51bWVyaWMoQ08yX2VtaXNzaW9ucyRZZWFyKQoKc3VtbWFyeShDTzJfZW1pc3Npb25zJFllYXIpCgpnZ3Bsb3QoQ08yX2VtaXNzaW9ucywgYWVzKHg9WWVhciwgeT1gQ08yIEVtaXNzaW9ucyAoTWcpYCwgZ3JvdXA9Q291bnRyeSkpICsKICBnZW9tX2xpbmUoYWxwaGE9MC4yKSArIAogIGxhYnModGl0bGUgPSBleHByZXNzaW9uKCJDb3VudHJ5IENPIlsyXSoiIEVtaXNzaW9ucyBwZXIgWWVhciAsIDE3NTEtMjAxNCIpLAogICAgICAgY2FwdGlvbiA9IGV4cHJlc3Npb24oIkxpbWl0ZWQgdG8gcmVwb3J0aW5nIGNvdW50cmllcyIpKSArIAogIHlsYWIoIkVtaXNzaW9ucyAoMU0gTWV0cmljIFRvbm5lcykiKQoKQ08yX3dvcmxkPC1DTzJfZW1pc3Npb25zICU+JQogIGdyb3VwX2J5KFllYXIpICU+JQogIHN1bW1hcmlzZShgQ08yIEVtaXNzaW9ucyAoTWcpYCA9IHN1bShgQ08yIEVtaXNzaW9ucyAoTWcpYCwgbmEucm0gPSBUUlVFKSkgJT4lCiAgZ2dwbG90KGFlcyh4PVllYXIsIHk9YENPMiBFbWlzc2lvbnMgKE1nKWApKSArCiAgZ2VvbV9saW5lKCkgKyAKICBsYWJzKHRpdGxlID0gZXhwcmVzc2lvbigiV29ybGQgQ08iWzJdKiIgRW1pc3Npb25zIHBlciBZZWFyICwgMTc1MS0yMDE0IiksCiAgICAgICBjYXB0aW9uID0gZXhwcmVzc2lvbigiTGltaXRlZCB0byByZXBvcnRpbmcgY291bnRyaWVzIikpICsgCiAgeWxhYigiRW1pc3Npb25zICgxTSBNZXRyaWMgTWV0cmljIFRvbm5lcykiKQpDTzJfd29ybGQKYGBgCgojIyMgWWVhcmx5IEdyb3d0aCBpbiBHRFAgcGVyIENhcGl0YQoKIyMjIyBTb3VyY2UKCltDbGljayBoZXJlIHRvIGJlIHJlZGlyZWN0ZWQgdG8gdGhlIHNvdXJjZSBmcm9tIHdoaWNoIHdlIG9idGFpbmVkIHRoaXMgZGF0YXNldF0oaHR0cHM6Ly93d3cuZ2FwbWluZGVyLm9yZy9kYXRhLykKCltDbGljayBoZXJlIHRvIGJlIHJlZGlyZWN0ZWQgdG8gdGhlIGRpcmVjdCBzb3VyY2UgZm9yIHRoaXMgZGF0YXNldF0oaHR0cHM6Ly9kYXRhLndvcmxkYmFuay5vcmcvaW5kaWNhdG9yL05ZLkdEUC5QQ0FQLktELlpHKQoKIyMjIyBDb2RlIAoKKipNaWNoYWVsKiogTmVlZCB0byBkZXRlcm1pbmUgdW5pdHMgZm9yIHRoaXMgCgpgYGB7cn0KZ2RwX2dyb3d0aCA8LSByZWFkX3hsc3goaGVyZSgiZG9jcy9nZHBfcGVyX2NhcGl0YV95ZWFybHlfZ3Jvd3RoLnhsc3giKSkKCmhlYWQoZ2RwX2dyb3d0aCkKCmdkcF9ncm93dGggPC0gZ2RwX2dyb3d0aCAlPiUKICBnYXRoZXIoa2V5ID0gWWVhciwgdmFsdWUgPSBnZHBfZ3Jvd3RoLCAtY291bnRyeSkgJT4lCiAgcmVuYW1lKENvdW50cnk9Y291bnRyeSkgJT4lCiAgcmVuYW1lKGBHRFAgR3Jvd3RoL0NhcGl0YSAoJSlgID0gZ2RwX2dyb3d0aCkgJT4lCiAgZmlsdGVyKGNvbXBsZXRlLmNhc2VzKC4pKQoKc2FwcGx5KGdkcF9ncm93dGgsIGNsYXNzKQoKZ2RwX2dyb3d0aCRZZWFyIDwtIGFzLm51bWVyaWMoZ2RwX2dyb3d0aCRZZWFyKQoKc3VtbWFyeShnZHBfZ3Jvd3RoJFllYXIpCgpnZ3Bsb3QoZ2RwX2dyb3d0aCwgYWVzKHg9WWVhciwgeT1gR0RQIEdyb3d0aC9DYXBpdGEgKCUpYCwgZ3JvdXA9Q291bnRyeSkpICsKICBnZW9tX2xpbmUoYWxwaGE9MC4yKSArIAogIGxhYnModGl0bGUgPSBleHByZXNzaW9uKCJDb3VudHJ5IEdEUCBHcm93dGggcGVyIENhcGl0YSBwZXIgWWVhciAoQW5udWFsICUpLCAxODAxLTIwMTkiKSwKICAgICAgIGNhcHRpb24gPSBleHByZXNzaW9uKCJMaW1pdGVkIHRvIHJlcG9ydGluZyBjb3VudHJpZXMiKSkgKyAKICB5bGFiKCJHRFAgR3Jvd3RoIHBlciBDYXBpdGEgKEFubnVhbCAlKSIpCgpnZHBfZ3Jvd3RoICU+JQogIGdyb3VwX2J5KFllYXIpICU+JQogIHN1bW1hcmlzZShgR0RQIEdyb3d0aC9DYXBpdGEgKCUpYCA9IG1lYW4oYEdEUCBHcm93dGgvQ2FwaXRhICglKWAsIG5hLnJtID0gVFJVRSkpICU+JQogIGdncGxvdChhZXMoeD1ZZWFyLCB5PWBHRFAgR3Jvd3RoL0NhcGl0YSAoJSlgKSkgKwogIGdlb21fbGluZSgpICsgCiAgbGFicyh0aXRsZSA9IGV4cHJlc3Npb24oIk1lYW4gQ291bnRyeSBHRFAgR3Jvd3RoIHBlciBDYXBpdGEgcGVyIFllYXIgKEFubnVhbCAlKSwgMTgwMS0yMDE5IiksCiAgICAgICBjYXB0aW9uID0gZXhwcmVzc2lvbigiTGltaXRlZCB0byByZXBvcnRpbmcgY291bnRyaWVzIikpICsgCiAgeWxhYigiR0RQIEdyb3d0aCBwZXIgQ2FwaXRhIChBbm51YWwgJSkiKQpgYGAKCiMjIyBFbmVyZ3kgVXNlIHBlciBQZXJzb24KCiMjIyMgU291cmNlCgpbQ2xpY2sgaGVyZSB0byBiZSByZWRpcmVjdGVkIHRvIHRoZSBzb3VyY2UgZnJvbSB3aGljaCB3ZSBvYnRhaW5lZCB0aGlzIGRhdGFzZXRdKGh0dHBzOi8vd3d3LmdhcG1pbmRlci5vcmcvZGF0YS8pCgpbQ2xpY2sgaGVyZSB0byBiZSByZWRpcmVjdGVkIHRvIHRoZSBkaXJlY3Qgc291cmNlIGZvciB0aGlzIGRhdGFzZXRdKGh0dHBzOi8vZGF0YS53b3JsZGJhbmsub3JnL2luZGljYXRvci9FRy5VU0UuUENBUC5LRy5PRSkKCiMjIyMgQ29kZQoKYGBge3J9CmVuZXJneV91c2UgPC0gcmVhZF94bHN4KGhlcmUoImRvY3MvZW5lcmd5X3VzZV9wZXJfcGVyc29uLnhsc3giKSkKCmhlYWQoZW5lcmd5X3VzZSkKCmVuZXJneV91c2UgPC0gZW5lcmd5X3VzZSAlPiUKICBnYXRoZXIoa2V5ID0gWWVhciwgdmFsdWUgPSBlbmVyZ3lfdXNlLCAtY291bnRyeSkgJT4lCiAgcmVuYW1lKENvdW50cnk9Y291bnRyeSkgJT4lCiAgcmVuYW1lKGBFbmVyZ3kgVXNlIChrZywgb2lsLWVxLi9jYXBpdGEpYCA9IGVuZXJneV91c2UpCgpzYXBwbHkoZW5lcmd5X3VzZSwgY2xhc3MpCgplbmVyZ3lfdXNlJFllYXIgPC0gYXMubnVtZXJpYyhlbmVyZ3lfdXNlJFllYXIpCgpzdW1tYXJ5KGVuZXJneV91c2UkWWVhcikKCmdncGxvdChlbmVyZ3lfdXNlLCBhZXMoeD1ZZWFyLCB5PWBFbmVyZ3kgVXNlIChrZywgb2lsLWVxLi9jYXBpdGEpYCwgZ3JvdXA9Q291bnRyeSkpICsKICBnZW9tX2xpbmUoYWxwaGE9MC4yKSArIAogIGxhYnModGl0bGUgPSBleHByZXNzaW9uKCJDb3VudHJ5IEVuZXJneSBVc2UgKGtnIG9mIE9pbCBFcXVpdmFsZW50IHBlciBDYXBpdGEpLCAxOTYwLTIwMTUiLCksCiAgICAgICBjYXB0aW9uID0gZXhwcmVzc2lvbigiTGltaXRlZCB0byByZXBvcnRpbmcgY291bnRyaWVzIikpICsgCiAgeWxhYigiRW5lcmd5IFVzZSAoa2cgb2YgT2lsIEVxdWl2YWxlbnQgcGVyIENhcGl0YSkiKQoKZW5lcmd5X3VzZSAlPiUKICBncm91cF9ieShZZWFyKSAlPiUKICBzdW1tYXJpc2UoYEVuZXJneSBVc2UgKGtnLCBvaWwtZXEuL2NhcGl0YSlgID0gc3VtKGBFbmVyZ3kgVXNlIChrZywgb2lsLWVxLi9jYXBpdGEpYCwgbmEucm0gPSBUUlVFKSkgJT4lCiAgZ2dwbG90KGFlcyh4PVllYXIsIHk9YEVuZXJneSBVc2UgKGtnLCBvaWwtZXEuL2NhcGl0YSlgKSkgKwogIGdlb21fbGluZSgpICsgCiAgbGFicyh0aXRsZSA9IGV4cHJlc3Npb24oIldvcmxkd2lkZSBFbmVyZ3kgVXNlIChrZyBvZiBPaWwgRXF1aXZhbGVudCBwZXIgQ2FwaXRhKSwgMTk2MC0yMDE1IiksCiAgICAgICBjYXB0aW9uID0gZXhwcmVzc2lvbigiTGltaXRlZCB0byByZXBvcnRpbmcgY291bnRyaWVzIikpICsgCiAgeWxhYigiRW5lcmd5IFVzZSAoa2cgb2YgT2lsIEVxdWl2YWxlbnQgcGVyIENhcGl0YSkiKQpgYGAKCiMjIyBDcnVkZSBNb3J0YWxpdHkgUmF0ZQoKIyMjIyBTb3VyY2UKCltDbGljayBoZXJlIHRvIGJlIHJlZGlyZWN0ZWQgdG8gdGhlIGRpcmVjdCBzb3VyY2UgZm9yIHRoaXMgZGF0YXNldF0oaHR0cHM6Ly9kYXRhLndvcmxkYmFuay5vcmcvaW5kaWNhdG9yL1NQLkRZTi5DRFJULklOKQoKIyMjIyBDb2RlCgpgYGB7cn0KbW9ydGFsaXR5IDwtIHJlYWRfeGxzKGhlcmUoImRvY3MvQVBJX1NQLkRZTi5DRFJULklOX0RTMl9lbl9leGNlbF92Ml84MDQzODQueGxzIikpCgpoZWFkKG1vcnRhbGl0eSkKCmNvbG5hbWVzKG1vcnRhbGl0eSkgPC0gbW9ydGFsaXR5WzMsXQptb3J0YWxpdHkgPC0gbW9ydGFsaXR5Wy1jKDE6MyksXQoKbW9ydGFsaXR5IDwtIG1vcnRhbGl0eSAlPiUKICBzZWxlY3QoLWBDb3VudHJ5IENvZGVgLAogICAgICAgICAtYEluZGljYXRvciBOYW1lYCwKICAgICAgICAgLWBJbmRpY2F0b3IgQ29kZWApICU+JQogIHJlbmFtZShDb3VudHJ5PSJDb3VudHJ5IE5hbWUiKSAlPiUKICBnYXRoZXIoa2V5ID0gWWVhciwgdmFsdWUgPSBgRGVhdGhzLzEwMDAgUGVvcGxlYCwgLUNvdW50cnkpCgpzYXBwbHkobW9ydGFsaXR5LCBjbGFzcykKCm1vcnRhbGl0eSRZZWFyIDwtIGFzLm51bWVyaWMobW9ydGFsaXR5JFllYXIpCm1vcnRhbGl0eSRgRGVhdGhzLzEwMDAgUGVvcGxlYCA8LSBhcy5udW1lcmljKG1vcnRhbGl0eSRgRGVhdGhzLzEwMDAgUGVvcGxlYCkKCnN1bW1hcnkobW9ydGFsaXR5JFllYXIpCgpnZ3Bsb3QobW9ydGFsaXR5LCBhZXMoeD1ZZWFyLCB5PWBEZWF0aHMvMTAwMCBQZW9wbGVgLCBncm91cD1Db3VudHJ5KSkgKwogIGdlb21fbGluZShhbHBoYT0wLjIpICsgCiAgbGFicyh0aXRsZSA9IGV4cHJlc3Npb24oIkNvdW50cnkgQ3J1ZGUgTW9ydGFsaXR5IFJhdGUgKHBlciAxMDAwIFBlcnNvbnMpLCAxOTYwLTIwMTkiLCksCiAgICAgICBjYXB0aW9uID0gZXhwcmVzc2lvbigiTGltaXRlZCB0byByZXBvcnRpbmcgY291bnRyaWVzIikpICsgCiAgeWxhYigiQ3J1ZGUgTW9ydGFsaXR5IFJhdGUgKHBlciAxMDAwIFBlcnNvbnMpIikKCm1vcnRhbGl0eSAlPiUKICBncm91cF9ieShZZWFyKSAlPiUKICBzdW1tYXJpc2UoYERlYXRocy8xMDAwIFBlb3BsZWAgPSBtZWFuKGBEZWF0aHMvMTAwMCBQZW9wbGVgLCBuYS5ybSA9IFRSVUUpKSAlPiUKICBnZ3Bsb3QoYWVzKHg9WWVhciwgeT1gRGVhdGhzLzEwMDAgUGVvcGxlYCkpICsKICBnZW9tX2xpbmUoKSArIAogIGxhYnModGl0bGUgPSBleHByZXNzaW9uKCJNZWFuIENvdW50cnkgQ3J1ZGUgTW9ydGFsaXR5IFJhdGUgKHBlciAxMDAwIFBlcnNvbnMpLCAxOTYwLTIwMTkiLCksCiAgICAgICBjYXB0aW9uID0gZXhwcmVzc2lvbigiTGltaXRlZCB0byByZXBvcnRpbmcgY291bnRyaWVzIikpICsgCiAgeWxhYigiQ3J1ZGUgTW9ydGFsaXR5IFJhdGUgKHBlciAxMDAwIFBlcnNvbnMpIikKYGBgCgojIyBVUy1zcGVjaWZpYyBEYXRhCgojIyMgRGlzYXN0ZXJzCgojIyMjIFNvdXJjZQoKW0NsaWNrIGhlcmUgdG8gYmUgcmVkaXJlY3RlZCB0byB0aGUgZGlyZWN0IHNvdXJjZSBmb3IgdGhpcyBkYXRhc2V0XShodHRwczovL3d3dy5uY2RjLm5vYWEuZ292L2JpbGxpb25zL3RpbWUtc2VyaWVzKQoKIyMjIyBDb2RlCgpgYGB7cn0KdXNfZGlzYXN0ZXIgPC0gcmVhZF9jc3YoaGVyZSgiZG9jcy90aW1lLXNlcmllcy1VUy5jc3YiKSwgc2tpcCA9IDIpCgp1c19kaXNhc3RlciA8LSB1c19kaXNhc3RlciAlPiUKICBkcGx5cjo6c2VsZWN0KFllYXIsCiAgICAgICAgICAgICAgICBgRHJvdWdodCBDb3VudGAsCiAgICAgICAgICAgICAgICBgRmxvb2RpbmcgQ291bnRgLAogICAgICAgICAgICAgICAgYEZyZWV6ZSBDb3VudGAsCiAgICAgICAgICAgICAgICBgU2V2ZXJlIFN0b3JtIENvdW50YCwKICAgICAgICAgICAgICAgIGBUcm9waWNhbCBDeWNsb25lIENvdW50YCwKICAgICAgICAgICAgICAgIGBXaWxkZmlyZSBDb3VudGAsCiAgICAgICAgICAgICAgICBgV2ludGVyIFN0b3JtIENvdW50YCkKCnNhcHBseSh1c19kaXNhc3RlciwgY2xhc3MpCgp1c19kaXNhc3RlciA8LSB1c19kaXNhc3RlciAlPiUKICBtdXRhdGUoYERpc2FzdGVyc2AgPSByb3dTdW1zKC5bMjpkaW0oLilbMl1dKSkgJT4lCiAgZHBseXI6OnNlbGVjdChZZWFyLAogICAgICAgICAgICAgICAgYERpc2FzdGVyc2ApICU+JQogIG11dGF0ZShDb3VudHJ5PSJVbml0ZWQgU3RhdGVzIikgJT4lCiAgZ2F0aGVyKGtleSA9IEluZGljYXRvciwgdmFsdWUgPSBWYWx1ZSwgLUNvdW50cnksIC1ZZWFyKSAlPiUKICBtdXRhdGUoUmVnaW9uPSJVbml0ZWQgU3RhdGVzIiwKICAgICAgICAgVHlwZT0iVVMtc3BlY2lmaWMiKQpgYGAKCiMjIyBUZW1wZXJhdHVyZQoKIyMjIyBTb3VyY2UKCltDbGljayBoZXJlIHRvIGJlIHJlZGlyZWN0ZWQgdG8gdGhlIGRpcmVjdCBzb3VyY2UgZm9yIHRoaXMgZGF0YXNldF0oaHR0cHM6Ly93d3cubmNkYy5ub2FhLmdvdi9jYWcvbmF0aW9uYWwvdGltZS1zZXJpZXMvKQoKIyMjIyBDb2RlCgpgYGB7cn0KdXNfdGVtcGVyYXR1cmUgPC0gcmVhZF9jc3YoaGVyZSgiZG9jcy90ZW1wZXJhdHVyZS50eHQiKSxza2lwPTQsbmE9Ii05OSIpCgpzYXBwbHkodXNfdGVtcGVyYXR1cmUsIGNsYXNzKQoKdXNfdGVtcGVyYXR1cmUgPC0gdXNfdGVtcGVyYXR1cmUgJT4lCiAgZHBseXI6OnNlbGVjdCgtQW5vbWFseSkgJT4lCiAgbXV0YXRlKERhdGUgPSBzdWJzdHIoRGF0ZSwgc3RhcnQgPSAxLCBzdG9wID0gNCkpICU+JQogIG11dGF0ZShDb3VudHJ5PSJVbml0ZWQgU3RhdGVzIiwKICAgICAgICAgWWVhciA9IERhdGUsCiAgICAgICAgIEluZGljYXRvcj0iVGVtcGVyYXR1cmUgKEZhaHJlbmhlaXQpIiwKICAgICAgICAgUmVnaW9uPSJVbml0ZWQgU3RhdGVzIiwKICAgICAgICAgVHlwZT0iVVMtc3BlY2lmaWMiKSAlPiUKICBkcGx5cjo6c2VsZWN0KC1EYXRlLCApCmBgYAoKIyMgQW5hbHlzaXMgZGF0YWZyYW1lCgpgYGB7cn0KY29sbmFtZXMoQ08yX2VtaXNzaW9ucykKY29sbmFtZXMoZ2RwX2dyb3d0aCkKY29sbmFtZXMoZW5lcmd5X3VzZSkKY29sbmFtZXMobW9ydGFsaXR5KQoKZGZfd2lkZSA8LSBDTzJfZW1pc3Npb25zICU+JQogIGZ1bGxfam9pbihnZHBfZ3Jvd3RoLCBieT1jKCJDb3VudHJ5IiwgIlllYXIiKSkgJT4lCiAgZnVsbF9qb2luKGVuZXJneV91c2UsIGJ5PWMoIkNvdW50cnkiLCAiWWVhciIpKSAlPiUKICBmdWxsX2pvaW4obW9ydGFsaXR5LCBieT1jKCJDb3VudHJ5IiwgIlllYXIiKSkKCmRmX2xvbmcgPC0gZGZfd2lkZSAlPiUKICBnYXRoZXIoa2V5PUluZGljYXRvcix2YWx1ZT1WYWx1ZSwtQ291bnRyeSwgLVllYXIpICU+JQogIG11dGF0ZShSZWdpb249Y2FzZV93aGVuKENvdW50cnk9PSJVbml0ZWQgU3RhdGVzIiB+ICJVbml0ZWQgU3RhdGVzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICBDb3VudHJ5IT0iVW5pdGVkIFN0YXRlcyIgfiAiUmVzdCBvZiB0aGUgV29ybGQiKSwKICAgICAgICAgVHlwZT0iR2xvYmFsIikKCnNldGVxdWFsKHNhcHBseShkZl9sb25nLCBjbGFzcyksc2FwcGx5KHVzX2Rpc2FzdGVyLCBjbGFzcykpCnNldGVxdWFsKHNhcHBseShkZl9sb25nLCBjbGFzcyksc2FwcGx5KHVzX3RlbXBlcmF0dXJlLCBjbGFzcykpCgpkZl9sb25nIDwtIGRmX2xvbmcgJT4lCiAgcmJpbmQodXNfZGlzYXN0ZXIpICU+JQogIHJiaW5kKHVzX3RlbXBlcmF0dXJlKQoKc2FwcGx5KGRmX2xvbmcsY2xhc3MpCgpkZl9sb25nJENvdW50cnkgPC0gYXMuZmFjdG9yKGRmX2xvbmckQ291bnRyeSkKZGZfbG9uZyRZZWFyIDwtIGFzLm51bWVyaWMoZGZfbG9uZyRZZWFyKQoKc2FwcGx5KGRmX2xvbmcsY2xhc3MpCgpkZl9sb25nIDwtIGRmX2xvbmcgJT4lCiAgZmlsdGVyKGNvbXBsZXRlLmNhc2VzKC4pKSAlPiUKICBhcnJhbmdlKENvdW50cnkpCmBgYAoKYGBge3IsIGV2YWw9RkFMU0V9CmdncGxvdChkZl9sb25nLCBhZXMoeD1ZZWFyLCB5PVZhbHVlLCBncm91cD1Db3VudHJ5KSkgKwogIGdlb21fbGluZShhbHBoYT0wLjIpICsgCiAgZmFjZXRfZ3JpZChJbmRpY2F0b3J+Liwgc2NhbGVzID0gImZyZWVfeSIpICsKICB5bGFiKCJJbmRpY2F0b3IgVmFsdWUiKSArIAogIGxhYnModGl0bGU9IkRpc3RyaWJ1dGlvbiBvZiBJbmRpY2F0b3JzIGJ5IFllYXIgYW5kIFZhbHVlIikKYGBgCgojIyBTdWJzZXR0aW5nIHRoZSBkYXRhCgpgYGB7cn0KZGZfbG9uZyAlPiUKICBmaWx0ZXIoVHlwZT09Ikdsb2JhbCIpICU+JQogIGdyb3VwX2J5KFllYXIsSW5kaWNhdG9yKSAlPiUKICB0YWxseSgpICU+JQogIGdncGxvdChhZXMoeD1ZZWFyLCB5PW4sIGNvbG9yPUluZGljYXRvcikpICsKICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSAxOTgwLCBsaW5ldHlwZT0yLCBjb2xvcj0iYmxhY2siKSArCiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gMjAxMCwgbGluZXR5cGU9MiwgY29sb3I9ImJsYWNrIikgKwogIGdlb21fbGluZSgpICsKICBsYWJzKHRpdGxlID0gIkNvdW50cmllcyB3aXRoIENvbXBsZXRlIERhdGEgcGVyIFllYXIiLAogICAgICAgc3VidGl0bGUgPSAiR2xvYmFsIERhdGEiKSArIAogIHlsYWIoIkNvdW50cmllcyIpICsgCiAgc2NhbGVfeF9jb250aW51b3VzKGJyZWFrcyA9IHNlcSgxNzUwLDIwMjAsYnk9MTApLAogICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBzZXEoMTc1MCwyMDIwLGJ5PTEwKSkgKwogIHRoZW1lX21pbmltYWwoKSArCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA5MCksCiAgICAgICAgYXhpcy50aXRsZS54ID0gZWxlbWVudF9ibGFuaygpLAogICAgICAgIGxlZ2VuZC5wb3NpdGlvbiA9ICJib3R0b20iKQoKZGZfbG9uZyAlPiUKICBmaWx0ZXIoUmVnaW9uPT0iVW5pdGVkIFN0YXRlcyIpICU+JQogIGdyb3VwX2J5KEluZGljYXRvcikgJT4lCiAgc3VtbWFyaXNlKFN0YXJ0PW1pbihZZWFyKSwgRW5kPW1heChZZWFyKSkgJT4lCiAgZ2dwbG90KGFlcyh4PUluZGljYXRvciwgeT1FbmQpKSArCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMTk4MCwgbGluZXR5cGU9MiwgY29sb3I9ImJsYWNrIikgKwogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDIwMTAsIGxpbmV0eXBlPTIsIGNvbG9yPSJibGFjayIpICsKICBnZW9tX3NlZ21lbnQoYWVzKHg9SW5kaWNhdG9yLAogICAgICAgICAgICAgICAgICAgeGVuZD1JbmRpY2F0b3IsCiAgICAgICAgICAgICAgICAgICB5ZW5kPUVuZCwKICAgICAgICAgICAgICAgICAgIHk9U3RhcnQpKSArCiAgZ2VvbV9wb2ludChhZXMoeD1JbmRpY2F0b3IsIHk9U3RhcnQpLCBzaGFwZT0xNiwgY29sb3I9ImJsYWNrIikgKwogIGdlb21fcG9pbnQoYWVzKHg9SW5kaWNhdG9yLCB5PUVuZCksIHNoYXBlPTIxLCBmaWxsPSJ3aGl0ZSIsIGNvbG9yPSJibGFjayIpICsgCiAgY29vcmRfZmxpcCgpICsKICBsYWJzKHRpdGxlID0gIkNvbXBsZXRlIERhdGEgcGVyIFllYXIiLAogICAgICAgc3VidGl0bGUgPSAiVVMtc3BlY2lmaWMgRGF0YSIpICsgCiAgeWxhYigiQ291bnRyaWVzIikgKyAKICBzY2FsZV95X2NvbnRpbnVvdXMoYnJlYWtzID0gc2VxKDE3NTAsMjAyMCxieT0xMCksCiAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IHNlcSgxNzUwLDIwMjAsYnk9MTApKSArCiAgdGhlbWVfbWluaW1hbCgpICsKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDkwKSwKICAgICAgICBheGlzLnRpdGxlID0gZWxlbWVudF9ibGFuaygpKQpgYGAKCmBgYHtyLCBBbmltYXRpb25fMSwgd2FybmluZz1GQUxTRSwgZXZhbD1GQUxTRX0KYW5pbWF0aW9uXzEgPC0gZGZfbG9uZyAlPiUKICBmaWx0ZXIoVHlwZT09Ikdsb2JhbCIpICU+JQogIGZpbHRlcihJbmRpY2F0b3I9PSJEZWF0aHMvMTAwMCBQZW9wbGUiKSAlPiUKICBmaWx0ZXIoWWVhcj49MTk4MCkgJT4lCiAgZmlsdGVyKFllYXI8PTIwMTApICU+JQogIGdncGxvdChhZXMoeD1ZZWFyLCB5PVZhbHVlLCBncm91cD1Db3VudHJ5LCBjb2xvcj1SZWdpb24sIHNpemU9UmVnaW9uLGFscGhhPVJlZ2lvbikpICsKICBnZW9tX3BvaW50KCkgKwogIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSBjKCJSZWQiLCJCbGFjayIpKSArCiAgc2NhbGVfYWxwaGFfbWFudWFsKHZhbHVlcyA9IGMoMC4xLCAxKSkgKwogIHNjYWxlX3NpemVfbWFudWFsKHZhbHVlcyA9IGMoMC4yNSwgMikpICsKICBsYWJzKHRpdGxlPSJEaXN0cmlidXRpb24gb2YgSW5kaWNhdG9ycyBieSBZZWFyIGFuZCBWYWx1ZSwgMTk4MC0yMDEwIikgKwogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gOTApKSArIAogIHRoZW1lX2NsYXNzaWMoKSArCiAgeWxhYigiQ3J1ZGUgTW9ydGFsaXR5IFJhdGUiKSArCiAgdHJhbnNpdGlvbl90aW1lKGFzLmludGVnZXIoWWVhcikpICsKICBzaGFkb3dfd2FrZSh3YWtlX2xlbmd0aCA9IDEsIGFscGhhID0gRkFMU0UpCgphbmltYXRlKGFuaW1hdGlvbl8xLCBmcHMgPSAxMCwgZHVyYXRpb24gPSA1KQpgYGAKCmBgYHtyLCBBbmltYXRpb25fMiwgd2FybmluZz1GQUxTRSwgZXZhbD1GQUxTRX0KYW5pbWF0aW9uXzIgPC0gZGZfbG9uZyAlPiUKICBmaWx0ZXIoVHlwZT09Ikdsb2JhbCIpICU+JQogIGZpbHRlcihJbmRpY2F0b3I9PSJFbmVyZ3kgVXNlIChrZywgb2lsLWVxLi9jYXBpdGEpIikgJT4lCiAgZmlsdGVyKFllYXI+PTE5ODApICU+JQogIGZpbHRlcihZZWFyPD0yMDEwKSAlPiUKICBnZ3Bsb3QoYWVzKHg9WWVhciwgeT1WYWx1ZSwgZ3JvdXA9Q291bnRyeSwgY29sb3I9UmVnaW9uLCBzaXplPVJlZ2lvbiwgYWxwaGE9UmVnaW9uKSkgKwogIGdlb21fcG9pbnQoKSArCiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IGMoIlJlZCIsIkJsYWNrIikpICsKICBzY2FsZV9hbHBoYV9tYW51YWwodmFsdWVzID0gYygwLjEsIDEpKSArCiAgc2NhbGVfc2l6ZV9tYW51YWwodmFsdWVzID0gYygwLjI1LCAyKSkgKwogIGxhYnModGl0bGU9IkRpc3RyaWJ1dGlvbiBvZiBJbmRpY2F0b3JzIGJ5IFllYXIgYW5kIFZhbHVlLCAxOTgwLTIwMTAiKSArCiAgdGhlbWVfY2xhc3NpYygpICsKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDkwKSkgKyAKICB5bGFiKCJFbmVyZ3kgVXNlIHBlciBDYXBpdGEiKSArCiAgdHJhbnNpdGlvbl90aW1lKGFzLmludGVnZXIoWWVhcikpICsKICBzaGFkb3dfd2FrZSh3YWtlX2xlbmd0aCA9IDEsIGFscGhhID0gRkFMU0UpCgphbmltYXRlKGFuaW1hdGlvbl8yLCBmcHMgPSAxMCwgZHVyYXRpb24gPSA1KQpgYGAKCmBgYHtyLCBBbmltYXRpb25fMywgd2FybmluZz1GQUxTRSwgZXZhbD1GQUxTRX0KYW5pbWF0aW9uXzMgPC0gZGZfbG9uZyAlPiUKICBmaWx0ZXIoVHlwZT09Ikdsb2JhbCIpICU+JQogIGZpbHRlcihJbmRpY2F0b3I9PSJHRFAgR3Jvd3RoL0NhcGl0YSAoJSkiKSAlPiUKICBmaWx0ZXIoWWVhcj49MTk4MCkgJT4lCiAgZmlsdGVyKFllYXI8PTIwMTApICU+JQogIGdncGxvdChhZXMoeD1ZZWFyLCB5PVZhbHVlLCBncm91cD1Db3VudHJ5LCBjb2xvcj1SZWdpb24sIHNpemU9UmVnaW9uLCBhbHBoYT1SZWdpb24pKSArCiAgZ2VvbV9wb2ludCgpICsKICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gYygiUmVkIiwiQmxhY2siKSkgKwogIHNjYWxlX2FscGhhX21hbnVhbCh2YWx1ZXMgPSBjKDAuMSwgMSkpICsKICBzY2FsZV9zaXplX21hbnVhbCh2YWx1ZXMgPSBjKDAuMjUsIDIpKSArCiAgbGFicyh0aXRsZT0iRGlzdHJpYnV0aW9uIG9mIEluZGljYXRvcnMgYnkgWWVhciBhbmQgVmFsdWUsIDE5ODAtMjAxMCIpICsKICB0aGVtZV9jbGFzc2ljKCkgKwogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gOTApKSArCiAgeWxhYigiR0RQIEdyb3d0aCBwZXIgQ2FwaXRhICglKSIpICsKICB0cmFuc2l0aW9uX3RpbWUoYXMuaW50ZWdlcihZZWFyKSkgKwogIHNoYWRvd193YWtlKHdha2VfbGVuZ3RoID0gMSwgYWxwaGEgPSBGQUxTRSkKCmFuaW1hdGUoYW5pbWF0aW9uXzMsIGZwcyA9IDEwLCBkdXJhdGlvbiA9IDUpCmBgYAoKYGBge3IsIEFuaW1hdGlvbl80LCB3YXJuaW5nPUZBTFNFLCBldmFsPUZBTFNFfQphbmltYXRpb25fNCA8LSBkZl9sb25nICU+JQogIGZpbHRlcihUeXBlPT0iR2xvYmFsIikgJT4lCiAgZmlsdGVyKEluZGljYXRvcj09IkNPMiBFbWlzc2lvbnMgKE1nKSIpICU+JQogIGZpbHRlcihZZWFyPj0xOTgwKSAlPiUKICBmaWx0ZXIoWWVhcjw9MjAxMCkgJT4lCiAgZ2dwbG90KGFlcyh4PVllYXIsIHk9VmFsdWUsIGdyb3VwPUNvdW50cnksIGNvbG9yPVJlZ2lvbiwgc2l6ZT1SZWdpb24sIGFscGhhPVJlZ2lvbikpICsKICBnZW9tX3BvaW50KCkgKwogIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSBjKCJSZWQiLCJCbGFjayIpKSArCiAgc2NhbGVfYWxwaGFfbWFudWFsKHZhbHVlcyA9IGMoMC4xLCAxKSkgKwogIHNjYWxlX3NpemVfbWFudWFsKHZhbHVlcyA9IGMoMC4yNSwgMikpICsKICBsYWJzKHRpdGxlPSJEaXN0cmlidXRpb24gb2YgSW5kaWNhdG9ycyBieSBZZWFyIGFuZCBWYWx1ZSwgMTk4MC0yMDEwIikgKwogIHRoZW1lX2NsYXNzaWMoKSArCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA5MCkpICsKICB5bGFiKCJDTzIgRW1pc3Npb25zIChNZykiKSArCiAgdHJhbnNpdGlvbl90aW1lKGFzLmludGVnZXIoWWVhcikpICsKICBzaGFkb3dfd2FrZSh3YWtlX2xlbmd0aCA9IDEsIGFscGhhID0gRkFMU0UpCgphbmltYXRlKGFuaW1hdGlvbl80LCBmcHMgPSAxMCwgZHVyYXRpb24gPSA1KQpgYGAKCmBgYHtyfQpUb3AxMDwtZGZfbG9uZyAlPiUKICBmaWx0ZXIoVHlwZT09Ikdsb2JhbCIpICU+JQogIGZpbHRlcihJbmRpY2F0b3I9PSJDTzIgRW1pc3Npb25zIChNZykiKSAlPiUKICBmaWx0ZXIoWWVhcj49MTkwMCkgJT4lCiAgZmlsdGVyKFllYXI8PTIwMTApICU+JQogIGdyb3VwX2J5KENvdW50cnkpICU+JQogIG11dGF0ZShtYXhfdmFsID0gbWF4KFZhbHVlKSkgJT4lCiAgdW5ncm91cCgpICU+JQogIG11dGF0ZShyYW5rPWRlbnNlX3JhbmsoLW1heF92YWwpKSAlPiUKICBmaWx0ZXIocmFuazw9MTApICU+JQogIGdncGxvdChhZXMoeD1ZZWFyLCB5PWZjdF9yZW9yZGVyKENvdW50cnksIFZhbHVlLCBtYXgpKSkgKwogIGdlb21fdGlsZShjb2xvcj0idHJhbnNwYXJlbnQiLCBhZXMoZmlsbD1sb2coVmFsdWUpKSkgKwogIHNjYWxlX2ZpbGxfZ3JhZGllbnRuKGNvbG9ycyA9IGMoInllbGxvdyIsInJlZCIsImJsYWNrIikpICsKICBzY2FsZV94X2NvbnRpbnVvdXMoYnJlYWtzID0gc2VxKDE5MDAsMjAxMCxieT01KSwKICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gc2VxKDE5MDAsMjAxMCxieT01KSkgKyAKICB0aGVtZV9jbGFzc2ljKCkgKyAKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDkwKSwKICAgICAgICBheGlzLnRpdGxlID0gZWxlbWVudF9ibGFuaygpLAogICAgICAgIGxlZ2VuZC5wb3NpdGlvbiA9ICJib3R0b20iKSArIAogIGxhYnModGl0bGUgPSAiVG9wIDEwIEVtaXNzaW9ucy1wcm9kdWNpbmcgQ291bnRyaWVzIGluIDIwMTAgKDE5MDAtMjAxMCkiLAogICAgICAgc3VidGl0bGUgPSAiT3JkZXJlZCBieSBFbWlzc2lvbnMgUHJvZHVjZWQgaW4gMjAxMCIsCiAgICAgICBmaWxsID0gIkxuKENPMiBFbWlzc2lvbnMgKE1nKSkiKQoKVG9wMTAKYGBgCgojIyBVUy1zcGVjaWZpYwoKYGBge3J9CmRmX2xvbmdfdXMgPC0gZGZfbG9uZyAlPiUKICBmaWx0ZXIoQ291bnRyeT09IlVuaXRlZCBTdGF0ZXMiKQoKIyBBcHByb3hpbWF0ZWQgZGVyaXZhdGl2ZSBmdW5jdGlvbikKZGZfbG9uZ191cyA8LSBkZl9sb25nX3VzICU+JQogIGZpbHRlcihZZWFyPj0xOTAwLAogICAgICAgICBZZWFyPD0yMDEwKSAlPiUKICBncm91cF9ieShJbmRpY2F0b3IpICU+JQogIG11dGF0ZSgiQ2hhbmdlICglKSI9KChWYWx1ZS9sYWcoVmFsdWUpKSoxMDApLTEwMCwKICAgICAgICAgTWVhbj1tZWFuKFZhbHVlKSwKICAgICAgICAgQW5vbWFseT1WYWx1ZS1NZWFuKSAlPiUKICB1bmdyb3VwKCkgJT4lCiAgbXV0YXRlKEFub21hbHlfY29sb3I9aWZlbHNlKEFub21hbHk+MCwiUG9zaXRpdmUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoQW5vbWFseTwwLCJOZWdhdGl2ZSIsIlplcm8iKSksCiAgICAgICAgIEFub21hbHlfY29sb3I9ZmFjdG9yKEFub21hbHlfY29sb3IsIGxldmVscyA9IGMoIlBvc2l0aXZlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTmVnYXRpdmUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJaZXJvIiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZGVyZWQgPSBUUlVFKSkKYGBgCgpgYGB7cn0KVVNfSW5kaWNhdG9yczwtZGZfbG9uZ191cyAlPiUKICBmaWx0ZXIoWWVhcj49MTk4MCkgJT4lCiAgZmlsdGVyKFllYXI8PTIwMTApICU+JQogIGdncGxvdChhZXMoeD1ZZWFyLCB5PVZhbHVlKSkgKyAKICBnZW9tX2xpbmUoKSArIAogIGZhY2V0X3dyYXAoSW5kaWNhdG9yfi4sIG5jb2w9MiwgbnJvdz0zLCBzY2FsZXMgPSAiZnJlZV95IikgKyAKICBzY2FsZV94X2NvbnRpbnVvdXMoYnJlYWtzID0gc2VxKDE5ODAsMjAxMCxieT01KSwKICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gc2VxKDE5ODAsMjAxMCxieT01KSkgKwogIHRoZW1lX2NsYXNzaWMoKSArIAogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gOTApLAogICAgICAgIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfYmxhbmsoKSkgKyAKICBsYWJzKHRpdGxlID0gIlVTLXNwZWNpZmljIEluZGljYXRvcnMgKDE5ODAtMjAxMCkiKQpVU19JbmRpY2F0b3JzCmBgYAoKYGBge3J9CmRmX2xvbmdfdXMgJT4lCiAgZmlsdGVyKFllYXI+PTE5ODApICU+JQogIGZpbHRlcihZZWFyPD0yMDEwKSAlPiUKICBnZ3Bsb3QoYWVzKHg9WWVhciwgeT1gQ2hhbmdlICglKWAsIGNvbG9yPUluZGljYXRvciwgZmlsbD0idHJhbnNwYXJlbnQiKSkgKyAKICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQ9MC44LCBsaW5ldHlwZT0yKSArCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0PTEuMiwgbGluZXR5cGU9MikgKwogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDEsIGxpbmV0eXBlPTMpICsKICBnZW9tX2xpbmUoc2l6ZT0wLjUpICsgCiAgc2NhbGVfeF9jb250aW51b3VzKGJyZWFrcyA9IHNlcSgxOTgwLDIwMTAsYnk9NSksCiAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IHNlcSgxOTgwLDIwMTAsYnk9NSkpICsKICBzY2FsZV95X2NvbnRpbnVvdXMoYnJlYWtzID0gc2VxKC01MDAsMTI1MCwgYnk9MjUwKSwKICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gc2VxKC01MDAsMTI1MCwgYnk9MjUwKSkgKwogIHRoZW1lX2NsYXNzaWMoKSArCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA5MCksCiAgICAgICAgYXhpcy50aXRsZS54ICA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICBsZWdlbmQucG9zaXRpb24gPSAiYm90dG9tIiwKICAgICAgICBsZWdlbmQuZGlyZWN0aW9uID0gImhvcml6b250YWwiKSArIAogIGxhYnModGl0bGUgPSAiVVMtc3BlY2lmaWMgSW5kaWNhdG9ycyAoMTk4MC0yMDEwKSIsCiAgICAgICBzdWJ0aXRsZSA9ICJDaGFuZ2UgKCUpIExpbmVzIikKCmRmX2xvbmdfdXMgJT4lCiAgZmlsdGVyKFllYXI+PTE5ODApICU+JQogIGZpbHRlcihZZWFyPD0yMDEwKSAlPiUKICBmaWx0ZXIoSW5kaWNhdG9yPT0iVGVtcGVyYXR1cmUgKEZhaHJlbmhlaXQpInwKICAgICAgICAgICBJbmRpY2F0b3I9PSJFbmVyZ3kgVXNlIChrZywgb2lsLWVxLi9jYXBpdGEpInwKICAgICAgICAgICBJbmRpY2F0b3I9PSJDTzIgRW1pc3Npb25zIChNZykiKSAlPiUKICBnZ3Bsb3QoYWVzKHg9WWVhciwgeT1gQ2hhbmdlICglKWAsIGNvbG9yPUluZGljYXRvcikpICsgCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0PTAuOCwgbGluZXR5cGU9MikgKwogIGdlb21faGxpbmUoeWludGVyY2VwdD0xLjIsIGxpbmV0eXBlPTIpICsKICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAxLCBsaW5ldHlwZT0zKSArCiAgZ2VvbV9saW5lKHNpemU9MSkgKwogIHNjYWxlX3hfY29udGludW91cyhicmVha3MgPSBzZXEoMTk4MCwyMDEwLGJ5PTUpLAogICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBzZXEoMTk4MCwyMDEwLGJ5PTUpKSArCiAgc2NhbGVfeV9jb250aW51b3VzKGJyZWFrcyA9IHNlcSgtMTAsMTAsIGJ5PTEpLAogICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBzZXEoLTEwLDEwLCBieT0xKSwKICAgICAgICAgICAgICAgICAgICAgbGltaXRzID0gYygtMTAsMTApKSArCiAgdGhlbWVfY2xhc3NpYygpICsKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDkwKSwKICAgICAgICBheGlzLnRpdGxlLnggID0gZWxlbWVudF9ibGFuaygpLAogICAgICAgIGxlZ2VuZC5wb3NpdGlvbiA9ICJib3R0b20iLAogICAgICAgIGxlZ2VuZC5kaXJlY3Rpb24gPSAiaG9yaXpvbnRhbCIpICsgCiAgbGFicyh0aXRsZSA9ICJFbWlzc2lvbnMsIEVuZXJneSBVc2UsIGFuZCBUZW1wZXJhdHVyZSAoMTk4MC0yMDEwKSIsCiAgICAgICBzdWJ0aXRsZSA9ICJDaGFuZ2UgKCUpIExpbmVzIikKCmRmX2xvbmdfdXMgJT4lCiAgZmlsdGVyKFllYXI+PTE5ODApICU+JQogIGZpbHRlcihZZWFyPD0yMDEwKSAlPiUKICBmaWx0ZXIoSW5kaWNhdG9yPT0iVGVtcGVyYXR1cmUgKEZhaHJlbmhlaXQpInwKICAgICAgICAgICBJbmRpY2F0b3I9PSJFbmVyZ3kgVXNlIChrZywgb2lsLWVxLi9jYXBpdGEpInwKICAgICAgICAgICBJbmRpY2F0b3I9PSJDTzIgRW1pc3Npb25zIChNZykiKSAlPiUKICBnZ3Bsb3QoYWVzKHg9WWVhciwgeT1gQ2hhbmdlICglKWAsIGNvbG9yPUluZGljYXRvcikpICsgCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0PTAuOCwgbGluZXR5cGU9MikgKwogIGdlb21faGxpbmUoeWludGVyY2VwdD0xLjIsIGxpbmV0eXBlPTIpICsKICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAxLCBsaW5ldHlwZT0zKSArCiAgZ2VvbV9zbW9vdGgoc2l6ZT0xLCBhbHBoYT0wLjEsIGFlcyhmaWxsPUluZGljYXRvciksIHNlPUZBTFNFKSArCiAgc2NhbGVfeF9jb250aW51b3VzKGJyZWFrcyA9IHNlcSgxOTgwLDIwMTAsYnk9NSksCiAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IHNlcSgxOTgwLDIwMTAsYnk9NSkpICsKICBzY2FsZV95X2NvbnRpbnVvdXMoYnJlYWtzID0gc2VxKC0xMCwxMCwgYnk9MSksCiAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IHNlcSgtMTAsMTAsIGJ5PTEpLAogICAgICAgICAgICAgICAgICAgICBsaW1pdHMgPSBjKC0xMCwxMCkpICsKICB0aGVtZV9jbGFzc2ljKCkgKyAKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDkwKSwKICAgICAgICBheGlzLnRpdGxlLnggID0gZWxlbWVudF9ibGFuaygpLAogICAgICAgIGxlZ2VuZC5wb3NpdGlvbiA9ICJib3R0b20iLAogICAgICAgIGxlZ2VuZC5kaXJlY3Rpb24gPSAiaG9yaXpvbnRhbCIpICsgCiAgbGFicyh0aXRsZSA9ICJVUyBFbWlzc2lvbnMsIEVuZXJneSBVc2UsIGFuZCBUZW1wZXJhdHVyZXMgKDE5ODAtMjAxMCkiLAogICAgICAgc3VidGl0bGUgPSAiU21vb3RoZWQgQ2hhbmdlICglKSBMaW5lcyIpCmBgYAoKYGBge3J9CmRmX2xvbmdfdXMgJT4lCiAgZmlsdGVyKFllYXI+PTE5ODApICU+JQogIGZpbHRlcihZZWFyPD0yMDEwKSAlPiUKICBmaWx0ZXIoSW5kaWNhdG9yPT0iQ08yIEVtaXNzaW9ucyAoTWcpInwKICAgICAgICAgICBJbmRpY2F0b3I9PSJUZW1wZXJhdHVyZSAoRmFocmVuaGVpdCkiKSAlPiUKICBnZ3Bsb3QoYWVzKHg9WWVhciwgeT1WYWx1ZSkpICsKICBnZW9tX2xpbmUoKSArIAogIHNjYWxlX3hfY29udGludW91cyhicmVha3MgPSBzZXEoMTk4MCwyMDEwLGJ5PTUpLAogICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBzZXEoMTk4MCwyMDEwLGJ5PTUpKSArIAogIGZhY2V0X3dyYXAoSW5kaWNhdG9yfi4sIHNjYWxlcyA9ICJmcmVlX3kiLCBuY29sPTEpICsKICB0aGVtZV9jbGFzc2ljKCkgKwogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gOTApLAogICAgICAgIGF4aXMudGl0bGUgPSBlbGVtZW50X2JsYW5rKCkpICsgCiAgbGFicyh0aXRsZT0iVVMgRW1pc3Npb25zIGFuZCBUZW1wZXJhdHVyZXMgKDE5ODAtMjAxMCkiKQoKZGZfbG9uZ191cyAlPiUKICBmaWx0ZXIoSW5kaWNhdG9yPT0iQ08yIEVtaXNzaW9ucyAoTWcpInwKICAgICAgICAgICBJbmRpY2F0b3I9PSJUZW1wZXJhdHVyZSAoRmFocmVuaGVpdCkiKSAlPiUKICBnZ3Bsb3QoYWVzKHg9WWVhciwgeT1WYWx1ZSkpICsKICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSAxOTgwLCBsaW5ldHlwZT0yLCBjb2xvcj0iYmxhY2siKSArIAogIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IDIwMTAsIGxpbmV0eXBlPTIsIGNvbG9yPSJibGFjayIpICsKICBnZW9tX3NlZ21lbnQoYWVzKHg9WWVhciwgeT1WYWx1ZSwgeGVuZD1ZZWFyLCB5ZW5kPU1lYW4sY29sb3I9QW5vbWFseV9jb2xvciksIHNpemU9MS4yNSkgKwogIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSBjKCJyZWQiLCJibHVlIiwiZ3JheSIpKSArIAogIGdlb21faGxpbmUoYWVzKHlpbnRlcmNlcHQ9TWVhbiksIGxpbmV0eXBlPTEsIGNvbG9yPSJibGFjayIpICsKICBzY2FsZV94X2NvbnRpbnVvdXMoYnJlYWtzID0gc2VxKDE5MDAsMjAxMCxieT01KSwKICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gc2VxKDE5MDAsMjAxMCxieT01KSkgKwogIGZhY2V0X3dyYXAoSW5kaWNhdG9yfi4sIHNjYWxlcyA9ICJmcmVlX3kiLCBuY29sPTEpICsgCiAgdGhlbWVfY2xhc3NpYygpICsKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDkwKSwKICAgICAgICBheGlzLnRpdGxlID0gZWxlbWVudF9ibGFuaygpLAogICAgICAgIGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIikgICsKICBsYWJzKHRpdGxlID0gIlVTIEVtaXNzaW9ucyBhbmQgVGVtcGVyYXR1cmVzICgxOTAwLTIwMTApIiwKICAgICAgIHN1YnRpdGxlID0gIkluZGljYXRvciBNZWFuIFJlcHJlc2VudGVkIGJ5IFNvbGlkIEJsYWNrIExpbmUiKQpgYGAKCmBgYHtyfQpkZl9sb25nX3VzICU+JQogIGZpbHRlcihJbmRpY2F0b3I9PSJUZW1wZXJhdHVyZSAoRmFocmVuaGVpdCkifAogICAgICAgICAgIEluZGljYXRvcj09IkNPMiBFbWlzc2lvbnMgKE1nKSIpICU+JQogIGdncGxvdChhZXMoeD1ZZWFyLCB5PWBDaGFuZ2UgKCUpYCkpICsKICBhbm5vdGF0ZSgicmVjdCIsIHhtaW49LUluZiwgeG1heD1JbmYsIHltaW49MCwgeW1heD1JbmYsIGFscGhhPTAuMjUsIGZpbGw9ImdyZWVuIikgKwogIGFubm90YXRlKCJyZWN0IiwgeG1pbj0tSW5mLCB4bWF4PUluZiwgeW1pbj0tSW5mLCB5bWF4PTAsIGFscGhhPTAuMjUsIGZpbGw9InJlZCIpICsKICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQ9MCwgbGluZXR5cGU9MSkgKyAKICBnZW9tX3NlZ21lbnQoYWVzKHg9WWVhciwgeT1gQ2hhbmdlICglKWAsIHhlbmQ9WWVhciwgeWVuZD0wKSwgc2l6ZT0xLjI1KSArCiAgZmFjZXRfd3JhcChJbmRpY2F0b3J+Liwgc2NhbGVzID0gImZyZWVfeSIsIG5jb2w9MSkgKwogIHNjYWxlX3hfY29udGludW91cyhicmVha3MgPSBzZXEoMTkwMCwyMDEwLGJ5PTUpLAogICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBzZXEoMTkwMCwyMDEwLGJ5PTUpKSArCiAgdGhlbWVfY2xhc3NpYygpICsgCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA5MCksCiAgICAgICAgYXhpcy50aXRsZS54ICA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICBsZWdlbmQucG9zaXRpb24gPSAiYm90dG9tIiwKICAgICAgICBsZWdlbmQuZGlyZWN0aW9uID0gImhvcml6b250YWwiKSArIAogIGxhYnModGl0bGUgPSAiVVMgRW1pc3Npb25zLCBFbmVyZ3kgVXNlLCBhbmQgVGVtcGVyYXR1cmVzICgxOTgwLTIwMTApIiwKICAgICAgIHN1YnRpdGxlID0gIkNoYW5nZSAoJSkgTGluZXMiKQpgYGAKCk1haW4gcGxvdAoKYGBge3J9CgpsaWJyYXJ5KHBhdGNod29yaykKCkNPMl93b3JsZCArIFRvcDEwICsgVVNfSW5kaWNhdG9ycyArCiAgcGxvdF9sYXlvdXQod2lkdGhzID0gYygxLCAyKSwgaGVpZ2h0cyA9IHVuaXQoYygyLCA1KSwgYygnY20nLCAnbnVsbCcpKSkKCnBuZyhoZXJlOjpoZXJlKCJpbWciLCAibWFpbnBsb3QucG5nIiksIHdpZHRoID0gOTAwLCBoZWlnaHQgPSA3MDApCihDTzJfd29ybGQgfCBUb3AxMCkvIFVTX0luZGljYXRvcnMrCiAgICBwbG90X2xheW91dCh3aWR0aHMgPSBjKDEsIDIpLCBoZWlnaHRzID0gdW5pdChjKDQsIDUpLCBjKCdjbScsICdudWxsJykpKQpkZXYub2ZmKCkKYGBgCgoK